※ 전남대학교 박태준 교수님의 운영체제 강의를 듣고, 정리한 내용입니다.
페이지 테이블 관리는 쉬운 일이 아닙니다.
하나의 시스템에 여러 개의 프로세스가 존재
각 프로세스마다 페이지 테이블이 하나씩 존재하기 때문!
메모리 관리자는 특정 프로세스가 실행될 때 마다 해당 페이지 테이블을 참조하여 가상 주소를 물리 주소로 변환하는 작업을 반복해주어야 합니다.
페이지 테이블은 메모리 관리자가 자주 사용하는 자료 구조 → 빨리 접근해야 함
따라서 페이지 테이블은 물리 메모리 영역 중 운영체제 영역 ( 커널 ) 의 일부에 모아둠

여기서 발생하는 문제점은 다음과 같습니다.
1번의 메모리 엑세스를 위해 2번의 물리 메모리 엑세스가 필요함
페이지 테이블의 낭비
페이지 테이블도 스왑 대상

프로세스 주소 공간 → 물리 메모리의 프레임 ( 페이지 테이블 ) 에 접근 → 프레임 접근
비슷한 작업을 2번이나 반복하다보니, 이 문제를 해결하고자 캐싱을 도입하였습니다.

논리 주소를 물리 주소로 바꾸는 과정에서 중간 과정인 페이지 테이블을 읽어오는 시간을 없애거나 줄이고자, 페이지 접근에 대한 캐시 ( TLB ) 를 두었습니다.
MMU 안에 위치하여, 최근에 접근한 페이지와 프레임 번호의 쌍을 항목으로 저장하는 캐시 메모리
[페이지 번호 p, 프레임 번호 f] 를 항목으로 저장 → 연관 매핑
Content-Addressable Memory ( CAM ) 또는 associative memory 라고 불림 ( 비싸다..!! )

CPU 로부터 논리 주소 발생
논리 주소의 페이지 번호가 TLB 로 전달되고, 페이지 번호와 TLB 내 모든 항목을 동시에 비교

TLB 의 간단한 예제를 하나 살펴보면..
가정
32bit CPU, 페이지는 4KB
배열 n[100] 의 논리 주소는 0x2000 ( 페이지 2 ) 부터 시작
배열 n[100] 의 물리 주소는 0x7000 ( 프레임 7 ) 부터 시작
배열 n[100] 의 크기는 400byte 이며 페이지 2 에 모두 들어있음
페이지 테이블은 물리 메모리 0xA000번지부터 시작
n[0] 을 읽었을 때
아직 TLB 에 들어있는 값이 없기 때문에, TLB Miss
→ MMU 는 페이지 테이블로부터 프레임 번호를 읽은 후 물리주소 완성
→ 미스한 페이지에 [페이지번호, 프레임번호] 항목을 TLB 에 삽입

n[1] 을 읽었을 때
TLB 엔 이제 [2, 7] 이라는 페이지번호와 프레임번호의 쌍이 존재
→ TLB Hit, TLB 에서 출력되는 프레임 번호와 Offset 으로 물리 주소 완성

TLB 의 성능이 높이기 위해선 2가지 방법이 존재합니다.
페이지 크기가 크다는 말은, 페이지 하나하나의 크기가 크기 때문에 전체 페이지의 갯수는 줄어든다 와 같은 뜻입니다.
그래서 페이지가 클수록 TLB 와의 갯수차이가 줄어드니, TLB 히트율은 올라가게 됩니다.
물론 페이지 크기가 커질수록 내부 단편화가 증가하게 되므로 메모리 낭비가 심해집니다.
32비트 CPU 환경에서 프로세스당 페이지 테이블 크기
10MB 의 메모리를 사용하는 프로세스가 있다고 하면
이렇게 활용률이 낮은 문제점을 해결하기 위해 두가지 해결법을 도입하였습니다.
물리 메모리의 프레임 번호를 기준으로 테이블 작성
역 페이지 테이블을 사용한 주소 변환

페이지 테이블을 여러 작은 페이지 테이블들로 나누고 여러 레벨로 구성 ( 계층화 )
two - level 로 멀티레벨 페이지 테이블을 구성하는 경우



위의 예제처럼 계층화를 통해 페이지 테이블로 인한 메모리 소모를 확연히 줄일 수 있습니다.