페이징

페이지 테이블 관리

 

페이지 테이블은 메모리 관리자가 자주 사용하는 자료구조이므로 빨리 접근할 수 있어야 한다.

따라서 페이지테이블을 물리 메모리 영역 중 운영체제 영역의 일부분에 모아놓는다.

 

프로세스마다 페이지 테이블이 하나씩 있기 때문에

프로세스의 수가 많아질수록 페이지 테이블의 크기가 커지고 프로세스가 사용할 수 있는 영역의 크기가 줄어든다.

예시를 통해 페이지 테이블의 크기를 계산해보자.

 

페이지 테이블의 크기 예시

32bit cpu와 512바이트 페이징 시스템이 있다고 가정하자.

각 프로세스마다 최대 메모리 크기는 약 4GB를 할당이고 512B 페이지로 나눈 페이지 테이블의 실제 크기는 약 24.11MB 라고 한다.

실행 중인 프로세스가 40개라면 무려 1GB를 페이지 테이블에 할당해야 한다.

 

한편, 페이지 테이블에 빠르게 접근하기 위해서

페이지 테이블의 시작 주소를 페이지 테이블 기준 레지스터(Page Table Base Register)에 보관한다.

위 레지스터는 pcb에 저장된다.

 

쓰기 시점 복사

같은 프로그램을 여러 프로세스로 실행할 수 있다.

이 때, 각 프로세스에 고유하게 메모리 영역을 할당하지 않고 페이지를 한 곳에 공유한다.

하지만 모든 영역을 공유할 수는 없기 때문에 운영체제는 데이터 변화에 대해 쓰기 시점 복사로 처리한다.

 

쓰기 시점 복사는 데이터 변화가 있을 때까지 복사를 미루는 방식이다.

가령, fork()를 통해 부모-자식 프로세스가 생성되면 자식 프로세스는 부모 프로세스를 복사해서 갖게 된다.

둘은 각자의 페이지 테이블에 공유하는 데이터에 대해 같은 프레임을 가리키게 된다.

 

만약 자식 프로세스에서 공유할 수 없는 데이터에 변경하고자 하면

그 시점에 페이지를 복사하여 새로운 내용으로 수정한다.

 


 

다단계 페이지 테이블, Multilevel Paging

 

다단계 페이징은 가상 메모리를 물리 메모리에 매핑하는 메모리 관리 기술이다. 대규모의 주소 공간을 효율적으로 관리하기 위해 사용된다.

페이지 테이블을 계층 구조로 구성하여 메모리 접근을 가속화합니다.

페이지 디렉터리를 가지며, 페이지 테이블의 상위 레벨이다. 페이지 디렉터리는 페이지 테이블의 시작 주소를 가지고 있다.

물리 메모리에 필요한 페이지 테이블 엔트리만 로드하여 공간을 절약할 수 있습니다.

 


요구 페이징

 

프로세스가 요청할 때 메모리로 가져오는 것을 말한다.

프로세스를 구성하는 모듈을 모두 가져오기 않고, 필요한 모듈만 로드한다.

요구 페이징으로 메모리를 효율적으로 관리할 수 있고 응답 속도를 향상할 수 있다.

 

페이지 테이블 엔트리의 구조

페이지 테이블 엔트리는 위 그림처럼 주소 필드(프레임)플레그 비트로 이루어져 있다.

 

Present bit

이 비트는 페이지 테이블 엔트리가 주소 변환에 사용될 수 있는지 여부를 나타낸다.

P=1인 경우에는 해당 엔트리가 사용될 수 있다는 것을 의미하며,

P=0인 경우에는 해당 엔트리가 주소 변환에 사용되지 않으며, 나머지 엔트리는 소프트웨어 사용을 위해 사용 가능하다.

 

페이지 테이블의 레벨 중 하나라도 P=0일 때 주소 변환에 페이지 테이블 엔트리를 사용하려고 시도하면

프로세서가 페이지 예외를 신호화합니다.

페이지 예외 처리기는 필요한 페이지를 물리 메모리로 가져올 수 있으며, 그런 다음 예외를 일으킨 명령을 다시 실행할 수 있습니다.

 

Access, Dirty bit

The processor sets the corresponding accessed bits in both levels of page tables to one before a read or write operation to a page.
The processor sets the dirty bit in the second-level page table to one before a write to an address covered by that page table entry. The dirty bit in directory entries is undefined.

두 비트를 간단하게 설명하면 접근 비트는 페이지가 메모리에 올라온 후, 사용된 적이 있는지에 대한 비트이고 접근하면 1로 만든다.

더티 비트는 변경 비트라고 할 수 있다. 접근하기 전에 1비트로 만든다.


 

페이지 부재, page fault

 

페이지를 요청했을 때, 그 페이지가 메모리에 없는 상황을 의미한다.

페이지 부재가 발생하면 스왑 영역에서 메모리로 옮기는, swap in 일어난다.

 

 

출처

 

쉽게 배우는 운영체제 2판 - 한빛아카데미

https://pdos.csail.mit.edu/6.828/2005/readings/i386/s05_02.htm