siino's 개발톡

Paging과 Segmentation 본문

운영체제

Paging과 Segmentation

siino 2024. 1. 24. 17:55

프로세스를 메모리에 올리기 위해서는 어떻게 해야할까요?

크게 두가지 방법을 생각하실 수 있을겁니다.

 

1. 메모리의 연속할당 방식

프로세스의 메모리 공간을 이름 그대로 연속적인 메모리 주소공간에 위치 시키는 방법입니다.

구현이 간단할 수 있지만 외부단편화 문제가 발생합니다.

 

 

또, '프로세스의 크기만큼을 전부 메모리에 올려야할까'라는 고민에서 그렇지 않습니다.

실제 CPU가 참조하는 프로세스는 전체 프로세스가 아닌 일부이기 때문이죠.

 

따라서 이 문제를 해결하기 위해 가상메모리 기법과 Paging, Segmentation기법이 등장하게 됩니다.

 

Paging

프로세스의 논리 메모리를 일정한 크기의 Page단위로 쪼개어 이를 실제 물리 메모리의 Frame 단위에 Mapping하는 방식입니다.

보통 Page의 크기는 Frame의 크기와 동일하고, 이렇게 쪼개어 메모리에 올리게 된다면 꼭 프로세스끼리 연속하지 않아도 됩니다.

 

그럼 Page가 어떻게 논리 메모리를 물리 메모리로 매핑해야하는지 자세히 알아봅시다.

프로세스의 어떤 페이지가 실제 물리 메모리의 어떤 frame에 매핑되는지 파악하기 위해서 Page Table이 필요하게 됩니다.

 

Page Table에는 Page번호, Frame번호, 유효비트, 참조비트 등이 저장됩니다.

이 Page table은 프로세스별로 다르기 때문에 각 프로세스별로 page table을 가지게 됩니다. 

이 page table을 이용하여 주소 변환을 담당하는 하드웨어인 MMU가 논리주소를 실제 물리 메모리로 변환하고 메모리에 접근하게 됩니다.

 

하지만 이때 두가지 문제가 있습니다.

1. CPU입장에서 임의의 프로세스 page table이 어디있는지 어떻게 알까?

2. CPU가 변환된 물리메모리 주소에 접근하기 위해 page table을 찾기 위해 1번, 실제 물리 메모리 주소로 접근하기 위해 1번 총 2번의 메모리 접근이 필요하다.

 

이를 해결하기 위해 PTBR, TLB가 존재합니다.

PTBR은 Page Table Base Register로, 찾고자 하는 페이지 테이블이 메모리 공간 내의 어느 위치에 있는지 알려주는 이정표 개념입니다.

TLB는 페이지 테이블 일부를 저장해놓는 캐시로서, CPU가 작업을 위해 메모리에 접근하는 시간을 줄여줍니다.

 

페이징에서 논리주소를 실제 물리주소로 변환하는 과정을 알아보자면,

1. TLB에서 해당 논리주소에 해당되는 캐시된 Page가 있는 지 검사.

2-1. TLB hit 시: 해당 캐시라인을 활용하여 MMU를 통해 논리주소 -> 물리주소로 변환 물리메모리 접근.

2-2. TLB miss 시: PTBR을 활용하여 해당 프로세스의 페이지 테이블의 위치 확인

3. 페이지 테이블에 접근하여 해당 페이지가 어떤 프레임에 매핑되는지 확인

4. MMU를 활용하여 논리주소 -> 물리주소로 변환

5. 실제 물리 메모리 접근

 

또한, Paging의 장점 중 하나는 프로세스 fork()시 새로운 자식 프로세스가 생성되었을 때, 부모 프로세스와 자식 프로세스내의 데이터는 복사되었기 때문에 물리메모리상 같은 값을 가리키게 됩니다.

하지만 이때, 자식 프로세스가 해당 물리 메모리의 값을 수정하게 되면 새로운 프레임이 자식프로세스에게 할당됩니다.

(쓰기시 복사, Copy -on-write)

 

자, 그럼 Paging기법에는 장점만 존재할까요?

Paging의 단점

- 페이지 테이블의 크기

- 페이지 테이블 접근 시간

- 내부단편화

 

32bit 컴퓨터에서 메모리는 최대 4GB까지 가능합니다.

(0x00000000 ~ 0xFFFFFFFF이고 한개의 주소공간를 담는 크기 = 1byte)

 

이 물리메모리를 4KB인 page로 관리하면 페이지 테이블의 크기는 최대 얼마가 될까요?

정답은 100만개의 entry를 관리해야합니다. 한개의 entry를 1byte라고 했을때,

약, 1MB의 크기를 page table로서 관리해야하는 것입니다.

 

또한, 앞서 말씀드렸다시피 TLB hit가 발생하지 않을때는 어쩔 수 없이 메모리 참조를 2번씩 해야하므로 오버헤드가 커질 수 있습니다.

 

내부단편화란 프로세스의 크기가 page의 배수가 아니게 될때 해당 프로세스의 할당된 마지막 page의 공간이 남는 현상입니다.

 

이를 해결하기 위해서 -> 계층적 페이징, 페이지의 크기조절 등의 방법을 사용할 수 있습니다.

 

 

Segmentation 기법이란

프로세스의 주소공간을 서로 크기가 다른 논리적인 블록단위인 세그먼트로 분할하고 메모리에 배치하는 방식입니다.

세그먼트로는 Code, Data, Stack & Heap이 있고 페이징과 유사하게 세그먼트 테이블이 존재하지만 각각의 세그먼트의 크기가 다르므로 limit 정보가 주어집니다.

 

장점: 내부 단편화 문제가 해소됨, 메모리 관리가 유용할 수 있음.

단점: 외부 단편화 문제가 생길 수 있음.

 

 

'운영체제' 카테고리의 다른 글

캐시 메모리 파헤치기  (0) 2024.01.23