메모리 가상화 - 페이징

재혁·2023년 5월 8일
0

Reference - Operating Systems: Three Easy Pieces


페이징


운영체제가 공간 관리 문제를 해결 하는데 있어서 세그멘테이션과 같은 기법을 채용하게된다면 메모리를 가변 크기의 청크들로 분할해 단편화(fragmentation) 라는 문제가 발생 할 수 있었다. 가변크기가 아닌 동일 크기의 조각들로 분할해 사용하면 되지않을까? 페이징의 등장이다.

페이징은 프로세스의 주소 공간을 몇개의 가변 크기의 논리 세그먼트로 나누는 것이 아니라 고정 크기의 페이지(page) 로 나눈다. 그리고 물리 메모리도 페이지 프레임(page frame) 이라는 고정 크기의 슬롯 배열이라고 생각한다. 이 프레임들은 페이지들과 상응해 각각 하나의 가상 메모리 페이지를 저장할 수 있다.


총 크기가 64바이트이면서 4개의 16바이트 페이지로 구성된 작은 주소 공간이 있다고 가정해보자. 페이지 0, 1, 2, 3은 각각 고정 크기의 페이지 프레임 슬롯에 분산 배치된다.


페이지 테이블


주소 공간의 각 페이지에 대한 물리 메모리를 기록하기 위해 운영체제는 프로세스 마다 페이지 테이블 이라는 자료 구조를 배분하는데, 이 페이지 테이블은 주소 공간의 페이지 주소 변환 정보를 담고있다. 위의 그림 같은경우에는 페이지 테이블은 (가상 페이지 0 👉 물리 프레임 3), (가상 페이지 1 👉 물리 프레임 7) 과 같은 정보를 담고 있을 것이다.

페이지 테이블은 다양한 자료구조로 구현될 수 있지만, 가장 간단한 형태는 선형 페이지 테이블 이다. 선형 페이지 테이블은 단순하고 빠른 배열로 구현된다.

페이지 테이블의 위치

페이지 테이블은 아주 커질 수가 있다. 예를 들어 4Kb의 크기의 페이지를 가지는 전형적인 32비트 주소 공간이 있다고 가정하면, 이 가상 주소는 20비트 VPN과 12비트의 오프셋으로 이루어져 있을 것이다. (1 << 12)
물리 주소로의 변환 정보와 다른 필요한 정보를 저장하기 위해 페이지 테이블 항목(PTE, Page Table Entry) 마다 4바이트가 필요하다고 가정하면, 각 페이지 테이블을 저장하기 위해 4Mb의 메모리가 필요하게 된다. 만약 프로세스가 100개 실행중이라면 400Mb가 필요하게 된다. 이처럼 페이지 테이블은 매우 커질수 있기 때문에 MMU에 있지 않고 메모리 상에 위치하고있다.

프로세스가 생성한 가상 주소를 물리 주소로 변환하기 위해 가상 주소를 가상 페이지 번호(VPN, Virtual Page Number) 와 페이지 내의 오프셋 2개의 요소로 분할한다. 그리고 운영체제와 하드웨어는 이 가상 주소의 VPN에 해당하는 비트를 물리 프레임 번호로 변환한다. 오프셋은 해당 페이지에서의 상대주소와 같은 개념이기때문에 그대로 있는 상태에서 (VPN)(오프셋) 👉 (물리프레임 번호)(오프셋) 과 같이 변환된다.

페이지 테이블 엔트리의 특수한 비트들

* x86 아키텍쳐의 페이지 테이블 항목 *

각 페이지 테이블 엔트리(PTE)에는 특수한 목적의 비트들이 있다.

  • Valid(유효) 비트 : 프로세스의 힙과 스택 사이의 미사용 공간을 무효로 표시하는데 사용하고, 만약 프로세스가 Invalid(유효하지않은) 공간을 접근하려고 하면 운영체제에 트랩을 발생시킨다.
  • Protection(보호) 비트 : 페이지가 읽을 수 있는지, 쓸 수 있는지, 또는 실행될 수 있는지를 표시해준다. 만약 프로세스가 허가되지 않은 방식으로 페이지에 접근하려고 하면 운영체제에 트랩을 발생시킨다.리눅스의 chmod가 생각난다
  • Dirty 비트 : 페이지가 메모리에 반입 된 후 변경되었는지 여부를 나타내 준다.
  • Present 비트 : 페이지가 물리 메모리에 있는지, 스왑 아웃 되어 디스크에 있는지 여부를 나타낸다.
  • Reference 비트 : 페이지가 접근 됐었는지 여부를 나타낸다. 이 비트는 어떤 페이지가 자주 접근 되는지 판단해 메모리에 유지되어야 하는 페이지를 판단하는데 유용하게 쓰인다.

페이징은 제대로 구현하지 못한다면 페이지 테이블 접근을 위한 많은 추가적 접근으로 인해 컴퓨터가 느려지고, 실제로 사용하는 데이터 대신 페이지 테이블로 가득 차 메모리가 낭비 될수가 있다. 이런 단점을 보완하기 위해 몇가지 추가적인 조치를 취할 수 있다.

0개의 댓글