운영체제가 공간 관리 문제를 해결 하는데 있어서 세그멘테이션과 같은 기법을 채용하게된다면 메모리를 가변 크기의 청크들로 분할해 단편화(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)에는 특수한 목적의 비트들이 있다.
페이징은 제대로 구현하지 못한다면 페이지 테이블 접근을 위한 많은 추가적 접근으로 인해 컴퓨터가 느려지고, 실제로 사용하는 데이터 대신 페이지 테이블로 가득 차 메모리가 낭비 될수가 있다. 이런 단점을 보완하기 위해 몇가지 추가적인 조치를 취할 수 있다.