가상 메모리 주소 변환: 페이지 테이블과 TLB의 역할

가상 메모리에서 페이지 테이블과 TLB가 가상 주소를 물리 주소로 변환하는 방식, 페이지 폴트와 대용량 페이지의 특성을 정리한다.

2026-08-14 · 최초 발행 2026-01-16

프로세스 주소 공간과 실제 메모리 사이

가상 메모리는 물리 메모리보다 큰 연속 주소 공간을 프로세스에 제공하는 메모리 관리 방식이다. 프로세스는 서로 분리된 가상 주소 공간을 사용하고, 운영체제와 하드웨어는 그 주소를 물리 메모리의 위치로 연결한다.

이 구조는 큰 프로그램의 실행, 프로세스별 메모리 보호, 필요한 페이지만 적재하는 요구 페이징, 공통 라이브러리 공유, 비활성 페이지의 보조기억장치 이동을 가능하게 한다.

물리 메모리MMU(Memory Management Unit)CPUTLB HitTLB Miss가상 주소(Virtual Address)페이지 테이블참조TLB확인물리 주소(Physical Address)실제 데이터

CPU가 만든 가상 주소는 MMU(Memory Management Unit)를 통과하면서 물리 주소로 바뀐다. 이때 변환 정보를 제공하는 것이 페이지 테이블이고, 변환 경로를 빠르게 만드는 것이 TLB다.

페이지 테이블이 보관하는 매핑 정보

페이지 테이블은 가상 페이지 번호(VPN: Virtual Page Number)와 물리 프레임 번호(PFN: Physical Frame Number)를 연결하는 자료구조다. 프로세스마다 별도의 페이지 테이블을 가진다.

페이지 테이블 엔트리(PTE)에는 프레임 번호 외에도 페이지의 상태와 접근 권한이 담긴다.

페이지 테이블 엔트리 (Page Table Entry)ValidBitReferenceBitModifiedBitProtectionBitsPhysical FrameNumber
필드 크기 설명
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비트를 차지한다.

주소 변환 과정가상 주소 (32비트)PDEPTE디렉터리 인덱스(10비트)페이지 테이블 인덱스(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가 포함될 수 있다.

TLB 배열Entry 0Entry 1Entry 2Entry N-1TLB 구조TLB 엔트리Tag(VPN 상위 비트)VPNPFNValidProtectionASID

가상 주소가 들어오면 CPU는 TLB에서 VPN을 먼저 찾는다. 적중하면 PFN을 바로 얻고 물리 주소를 계산한다. 미스가 나면 페이지 테이블 워크를 수행하며, 페이지가 유효하면 새 매핑을 TLB에 추가한다. 유효하지 않으면 페이지 폴트 처리와 적재를 거친 뒤 매핑을 추가한다.

YesNoYesNoCPU가 가상 주소 생성TLB에서 VPN 검색TLB Hit?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를 갱신한 뒤 해당 명령어를 다시 실행한다.

물리 메모리보조기억장치운영체제MMUCPU물리 메모리보조기억장치운영체제MMUCPU가상 주소 접근TLB Miss + PTE Invalid페이지 폴트 발생빈 프레임 확보페이지 읽기 요청페이지 데이터 전송페이지 테이블 갱신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 미스와 페이지 테이블 크기를 줄인다. 반면 내부 단편화가 커질 수 있으며, 메모리 압박 상황에서는 스왑이 어렵고 할당에 실패할 가능성도 있다.

가상 메모리페이지 테이블TLB운영체제주소 변환