가상 메모리 주소 변환: 페이지 테이블과 TLB의 역할
가상 메모리에서 페이지 테이블과 TLB가 가상 주소를 물리 주소로 변환하는 방식, 페이지 폴트와 대용량 페이지의 특성을 정리한다.
2026-08-14 · 최초 발행 2026-01-16
프로세스 주소 공간과 실제 메모리 사이
가상 메모리는 물리 메모리보다 큰 연속 주소 공간을 프로세스에 제공하는 메모리 관리 방식이다. 프로세스는 서로 분리된 가상 주소 공간을 사용하고, 운영체제와 하드웨어는 그 주소를 물리 메모리의 위치로 연결한다.
이 구조는 큰 프로그램의 실행, 프로세스별 메모리 보호, 필요한 페이지만 적재하는 요구 페이징, 공통 라이브러리 공유, 비활성 페이지의 보조기억장치 이동을 가능하게 한다.
CPU가 만든 가상 주소는 MMU(Memory Management Unit)를 통과하면서 물리 주소로 바뀐다. 이때 변환 정보를 제공하는 것이 페이지 테이블이고, 변환 경로를 빠르게 만드는 것이 TLB다.
페이지 테이블이 보관하는 매핑 정보
페이지 테이블은 가상 페이지 번호(VPN: Virtual Page Number)와 물리 프레임 번호(PFN: Physical Frame Number)를 연결하는 자료구조다. 프로세스마다 별도의 페이지 테이블을 가진다.
페이지 테이블 엔트리(PTE)에는 프레임 번호 외에도 페이지의 상태와 접근 권한이 담긴다.
| 필드 | 크기 | 설명 |
|---|---|---|
| Valid Bit | 1비트 | 페이지가 메모리에 적재되어 있는지 여부 |
| Reference Bit | 1비트 | 최근 페이지 접근 여부 (페이지 교체에 사용) |
| Modified Bit | 1비트 | 페이지 수정 여부 (Dirty Bit) |
| Protection Bits | 2-3비트 | 읽기/쓰기/실행 권한 |
| Physical Frame Number | 20+ 비트 | 물리 프레임 번호 |
32비트 가상 주소에서 4KB 페이지를 사용한다면 주소는 페이지 테이블을 찾기 위한 VPN과 페이지 내부 위치인 Offset으로 나뉜다.
| 구성 요소 | 비트 범위 | 설명 |
|---|---|---|
| VPN (Virtual Page Number) | 31:12 (20비트) | 페이지 테이블 인덱스 |
| Offset | 11:0 (12비트) | 페이지 내 오프셋 |
물리 주소 계산: Physical Address = (PFN × Page Size) + Offset
단일 레벨 페이지 테이블은 주소 공간이 커질수록 메모리 부담이 커진다. 32비트 주소 체계에서 4KB 페이지를 사용할 경우 가상 주소 공간은 4GB (2^32)이고, 페이지 수는 약 100만 개 (2^20)다. PTE 크기를 4바이트로 가정하면 프로세스당 페이지 테이블은 4MB가 된다. 64비트 시스템에서는 이 문제가 더 커진다.
사용한 주소 범위만 펼치는 다단계 구조
다단계 페이지 테이블(Multi-level Page Table)은 페이지 테이블도 페이징해 관리하는 방식이다. 사용하지 않는 주소 범위에 대해 하위 테이블을 만들지 않아 메모리를 아낄 수 있고, 큰 주소 공간을 다루기에도 적합하다.
32비트 주소를 2단계로 나누면 디렉터리 인덱스와 페이지 테이블 인덱스가 각각 10비트, 오프셋이 12비트를 차지한다.
x86-64 아키텍처는 다음과 같은 4단계 페이지 테이블 구조를 사용한다.
| 레벨 | 이름 | 인덱스 비트 | 엔트리 수 |
|---|---|---|---|
| 4 | PML4 (Page Map Level 4) | 47:39 (9비트) | 512 |
| 3 | PDPT (Page Directory Pointer Table) | 38:30 (9비트) | 512 |
| 2 | PD (Page Directory) | 29:21 (9비트) | 512 |
| 1 | PT (Page Table) | 20:12 (9비트) | 512 |
현재 48비트 가상 주소만 사용하며, 상위 16비트는 부호 확장된다.
TLB가 페이지 테이블 접근을 줄이는 방식
TLB(Translation Lookaside Buffer)는 최근 주소 변환 결과를 저장하는 하드웨어 캐시다. 다단계 페이지 테이블은 메모리를 효율적으로 쓰는 대신 변환 과정에서 페이지 테이블 접근이 추가된다. 4단계 페이지 테이블에서는 최대 4번의 추가 메모리 접근이 발생할 수 있으며, TLB는 이를 캐싱으로 줄인다.
TLB 엔트리에는 VPN, PFN, 유효 상태, 보호 정보와 ASID가 포함될 수 있다.
가상 주소가 들어오면 CPU는 TLB에서 VPN을 먼저 찾는다. 적중하면 PFN을 바로 얻고 물리 주소를 계산한다. 미스가 나면 페이지 테이블 워크를 수행하며, 페이지가 유효하면 새 매핑을 TLB에 추가한다. 유효하지 않으면 페이지 폴트 처리와 적재를 거친 뒤 매핑을 추가한다.
| 지표 | 설명 | 일반적인 값 |
|---|---|---|
| TLB 크기 | 엔트리 수 | 32-1024개 |
| Hit Time | TLB 조회 시간 | 1-2 사이클 |
| Miss Penalty | 미스 시 추가 시간 | 10-100+ 사이클 |
| Hit Rate | 적중률 | 95-99% |
유효 메모리 접근 시간(Effective Access Time, EAT)은 적중과 미스의 비용을 함께 반영한다.
EAT = Hit_Rate × (TLB_Time + Memory_Time) + (1 - Hit_Rate) × (TLB_Time + Page_Table_Time + Memory_Time)
예시) TLB 조회 20ns, 메모리 접근 100ns, TLB 적중률 98%:
- EAT = 0.98 × (20 + 100) + 0.02 × (20 + 100 + 100)
- EAT = 117.6 + 4.4 = 122ns
TLB 엔트리 교체에는 LRU(Least Recently Used), Random, FIFO 방식이 사용된다. LRU는 가장 오래 사용되지 않은 엔트리를 교체하고, Random은 무작위로 선택하며 구현이 간단하고 성능이 양호하다. FIFO는 가장 먼저 적재된 엔트리를 교체한다.
컨텍스트 스위칭, 페이지 테이블 변경, 특정 시스템 호출 수행 시에는 TLB Flush가 발생할 수 있다.
ASID로 컨텍스트 전환 비용 줄이기
ASID(Address Space Identifier)는 TLB 엔트리에 프로세스 식별자를 더해 컨텍스트 스위칭 때의 TLB 플러시 오버헤드를 줄이는 기법이다. TLB를 조회할 때 ASID도 함께 비교하므로, 멀티태스킹 환경에서 TLB 무효화를 줄이고 효율을 높일 수 있다.
| 특징 | 설명 |
|---|---|
| 목적 | 컨텍스트 스위칭 시 TLB 무효화 방지 |
| 크기 | 일반적으로 8-16비트 |
| 동작 | TLB 조회 시 ASID도 함께 비교 |
| 장점 | 멀티태스킹 환경에서 TLB 효율성 향상 |
메모리에 없는 페이지를 만났을 때
페이지 폴트는 접근 대상 페이지가 물리 메모리에 없을 때 발생하는 예외다. MMU가 TLB 미스와 유효하지 않은 PTE를 확인하면 운영체제가 빈 프레임을 확보하고, 보조기억장치에서 페이지 데이터를 읽어 물리 메모리에 적재한다. 페이지 테이블과 TLB를 갱신한 뒤 해당 명령어를 다시 실행한다.
| 유형 | 원인 | 처리 방법 |
|---|---|---|
| Hard Fault | 페이지가 디스크에 있음 | 디스크에서 로드 |
| Soft Fault | 페이지가 메모리에 있으나 매핑 안됨 | 페이지 테이블 갱신 |
| Invalid Fault | 잘못된 주소 접근 | 프로세스 종료 (Segfault) |
대용량 페이지가 넓히는 TLB 커버리지
대용량 페이지(Huge Pages)는 일반 페이지보다 큰 페이지를 사용해 TLB 미스를 줄이는 방식이다. 하나의 TLB 엔트리가 더 넓은 메모리 범위를 포괄한다.
| 페이지 크기 | 커버 범위 | TLB 엔트리당 |
|---|---|---|
| 4KB (일반) | 4KB | 4KB |
| 2MB (Large) | 2MB | 512배 효율 |
| 1GB (Huge) | 1GB | 262,144배 효율 |
대용량 페이지는 TLB 커버리지를 늘리고 TLB 미스와 페이지 테이블 크기를 줄인다. 반면 내부 단편화가 커질 수 있으며, 메모리 압박 상황에서는 스왑이 어렵고 할당에 실패할 가능성도 있다.