MMU: 가상 주소 변환과 TLB·페이지 테이블의 동작 원리

MMU가 가상 주소를 물리 주소로 변환하는 과정과 페이징, TLB, 캐시 구조, Huge Pages 기반 최적화를 정리한다.

2026-08-14 · 최초 발행 2025-12-28

주소 변환 경로가 시스템 격리와 성능을 만드는 방식

프로세스는 서로 분리된 가상 주소 공간에서 실행된다. CPU가 만든 가상 주소를 실제 물리 메모리 위치로 연결하는 장치가 MMU(Memory Management Unit)다. 이 경로는 단순한 주소 치환에 그치지 않는다. 프로세스 간 메모리 격리, Read/Write/Execute 권한 검사, 페이지 테이블 관리, 캐시 제어를 하드웨어 차원에서 뒷받침한다.

MMU가 담당하는 작업은 다음과 같다.

  • CPU의 가상 주소를 물리 주소로 변환하고, Page Table에서 매핑 정보를 찾는다.
  • TLB(Translation Lookaside Buffer)를 이용해 최근 변환 결과를 빠르게 재사용한다.
  • 프로세스별 메모리 영역과 커널·사용자 영역을 분리하며, 잘못된 접근에는 Exception을 발생시킨다.
  • Virtual Cache와 Physical Cache를 관리하고 Cache Coherence, Cache Miss, Write Policy를 지원한다.
  • Page Fault, Multi-level·Inverted Page Table, Dirty Bit, Reference Bit와 페이지 교체 알고리즘을 지원한다.

이 구조 덕분에 물리 메모리보다 큰 주소 공간을 제공하고, 프로세스마다 독립적인 메모리를 유지할 수 있다. 코드와 라이브러리 공유도 가능하며, Demand Paging으로 실제 사용하는 메모리만 적재할 수 있다.

YesNoYesNoYesNoCPU가상 주소MMUTLB(고속 변환)Page Table(매핑 정보)Hit?물리 주소Valid?Page FaultOS 처리디스크에서페이지 로드CacheHit?DataMain Memory

전체 적재와 필요한 만큼 적재하는 방식의 차이

Shadowing(그림자 메모리)은 실행 파일 전체를 DRAM에 올리고 가상 주소와 실제 주소를 1:1로 연결하는 방식이다. MMU의 주소 변환 기능이 필요하지 않아 구현과 실행 흐름이 단순하고 예측 가능하다. 반면 전체 프로그램이 메모리에 상주해야 하므로 메모리 낭비가 발생하며, 큰 프로그램과 다중 프로그래밍을 다루기 어렵고 보호 기능도 부족하다. 초기 운영체제인 DOS, ROM에서 실행되는 임베디드 시스템, 부트로더가 적용 사례다.

Demand Paging(요구 페이징)은 프로그램을 페이지 단위로 나누고, 필요한 시점에만 메모리에 올린다. 프로세스가 시작될 때 코드를 모두 적재하지 않으며, CPU가 아직 없는 페이지에 접근하면 Page Table의 Invalid 항목을 통해 Page Fault가 발생한다. OS는 해당 페이지를 디스크에서 메모리로 읽고 Page Table을 Valid로 갱신한 뒤 명령어를 다시 실행한다.

이 방식은 초기 시작 시간을 줄이고 물리 메모리보다 큰 프로그램도 실행하게 한다. 실제로 사용하는 페이지만 메모리를 차지한다는 장점이 있지만, 첫 접근에서 디스크 I/O에 따른 지연이 생기고 Page Fault 처리 및 페이지 교체 알고리즘이 필요하다. Prepaging, Working Set 관리, 4KB·16KB·2MB 등 페이지 크기 최적화가 함께 쓰인다.

Shadowing전체 로드가상주소 = 물리주소간단빠름메모리 낭비확장성 없음Demand Paging필요 로드가상주소 물리주소메모리 절약 프로그램 실행Page Fault오버헤드초기 시스템현대 OS

페이지와 프레임으로 나누는 가상 메모리

가상 메모리는 고정 크기의 페이지(Page)로 나뉜다. 일반적인 페이지 크기는 4KB(4096 bytes)이며, 2MB와 1GB 같은 Huge Pages도 사용한다. 페이지는 논리적으로 연속된 공간을 표현한다.

물리 메모리는 같은 크기의 프레임(Frame)으로 구성된다. 프레임은 불연속적으로 배치될 수 있고, 프레임 번호로 구분한다. Page Table은 가상 페이지 번호와 물리 프레임 번호의 관계를 보관한다.

작은 페이지는 내부 단편화를 줄이는 대신 Page Table을 키우고 Page Fault 빈도를 높일 수 있다. 4KB 페이지의 평균 내부 단편화는 2KB다. 2MB/1GB Huge Pages는 TLB Miss와 Page Table 크기를 낮추지만 내부 단편화는 커진다. 데이터베이스와 HPC는 이런 특성을 활용하는 대표적인 대상이다.

Page Table은 여러 방식으로 구성된다.

  • 단일 레벨 Page Table은 가상 페이지 번호를 인덱스로 사용한다. 32비트 주소와 4KB 페이지에서는 1M 엔트리 × 4B = 4MB/프로세스가 필요하다.
  • Multi-level Page Table은 2단계, 3단계, 4단계로 테이블을 나누고 사용하지 않는 영역에는 테이블을 할당하지 않는다. x86-64는 PML4, PDPT, PD, PT의 4단계 구조를 사용한다. 메모리는 절약하지만 검색 시간은 늘어난다.
  • Inverted Page Table은 프레임 번호를 인덱스로 사용한다. 크기가 프로세스 수와 무관하게 물리 메모리 크기에 비례하지만, 검색 시간이 길어 해시 테이블을 사용한다.

PTE(Page Table Entry)에는 물리 프레임 번호와 함께 Valid Bit, Dirty Bit, Reference Bit, R/W/X 권한 같은 Protection Bits가 들어간다. Dirty Bit는 Write Back에 필요하고, Reference Bit는 LRU 근사에 사용된다.

NoYes가상 주소32비트Page Number20비트Offset12비트Page TablePTEValid BitFrame NumberProtectionDirty BitReference BitValid?Page FaultFrame Number물리 주소Frame × 4KB + Offset

TLB가 페이지 테이블 접근을 줄이는 방법

주소 변환마다 Page Table을 참조하면 메모리 접근이 2배가 된다. Page Table 자체도 메모리에 있기 때문이다. Multi-level Page Table에서는 접근 횟수가 더 늘어나며, 4단계 구조는 5번 접근이 필요하다. TLB는 이 비용을 줄이기 위해 최근 사용한 주소 변환 정보를 저장하는 CPU 내부의 고속 하드웨어 캐시다. Fully Associative 또는 Set Associative 방식으로 구성된다.

일반적인 구성에서 L1 TLB는 Instruction/Data가 분리된 32-64 엔트리이고, L2 TLB는 512-1024 엔트리다. 크기는 작지만 Hit Rate는 95-99%에 이른다. TLB 엔트리에는 Virtual Page Number, Physical Frame Number, ASID(Address Space ID), Protection Bits, Valid Bit, Dirty Bit가 포함된다.

TLB Hit에서는 가상 페이지 번호로 엔트리를 검색해 물리 프레임 번호를 즉시 얻고 물리 주소를 계산한다. 이 과정은 1-2 cycles가 걸린다. TLB Miss이면 Page Table에서 변환 정보를 가져와 TLB에 새 엔트리를 넣고, 교체가 필요하면 LRU 등을 사용한다. 이 경우 수십 cycles가 소요된다.

Page Table에서도 Invalid가 확인되면 Page Fault가 발생한다. OS는 Exception을 처리하고 디스크에서 페이지를 읽은 뒤 Page Table과 TLB를 갱신한다. 디스크 I/O가 포함되므로 수백만 cycles가 든다.

프로세스 전환에서는 이전 프로세스의 TLB 엔트리가 잘못된 변환에 사용될 수 있다. TLB Flush는 전환 때 모든 엔트리를 무효화하는 단순한 방법이지만, 다음 프로세스의 초기 TLB Miss를 늘린다. ASID는 엔트리에 프로세스 ID를 넣어 Flush 없이 주소 공간을 구분하고 더 높은 Hit Rate를 유지한다. 현대 프로세서에서는 이 방식이 표준이다.

Yes95-99%No1-5%YesNo가상 주소TLB 검색TLB Hit?물리 주소(1-2 cycles)Page Table WalkValid?TLB 갱신Page FaultOS Handler(수백만 cycles)디스크 I/OPage Table 갱신

캐시에서 가상 주소와 물리 주소를 쓰는 선택

Virtual Cache는 가상 주소로 직접 캐시를 검색한다. MMU를 거치지 않고 캐시에 접근하므로 주소 변환과 캐시 접근을 병렬로 수행할 수 있으며, TLB Miss의 영향을 받지 않는 단순한 파이프라인을 만들 수 있다.

대신 다른 가상 주소가 같은 물리 주소를 가리키는 Aliasing, 서로 다른 프로세스에서 같은 가상 주소가 다른 물리 주소를 가리키는 Homonym 문제가 생긴다. Context Switch 때 캐시 Flush가 필요할 수 있고 Synonym 처리도 복잡하다. ASID/PID를 캐시 태그에 넣거나, Color-based Cache와 VIPT를 적용해 해결한다.

Physical Cache는 물리 주소를 기준으로 캐시를 검색한다. CPU는 MMU에서 주소를 변환한 뒤 캐시에 접근한다. Aliasing과 Homonym 문제가 없고, 멀티코어 환경에서 캐시 일관성을 관리하기 쉬우며 Context Switch 뒤에도 캐시를 유지할 수 있다. 구조는 단순하고 안정적이지만, MMU 지연이 캐시 접근에 더해지고 TLB Miss가 전체 성능에 크게 영향을 준다. 고성능 TLB, Pipelined 주소 변환, L1 VIPT와 L2/L3 Physical 조합으로 이를 완화한다.

VIPT(Virtually Indexed, Physically Tagged)는 캐시 세트를 고를 때 가상 주소 Index를 사용하고 Hit/Miss를 판단하는 Tag에는 물리 주소를 사용한다. 주소 변환과 캐시 접근을 병렬로 수행하면서 Virtual Cache의 속도와 Physical Cache의 안정성을 함께 얻는다.

VIPT에는 캐시 크기 ≤ 페이지 크기 × Associativity라는 제약이 있다. 4KB 페이지와 4-way 조합에서는 최대 16KB 캐시가 된다. 따라서 L1 Data Cache에 적합하며, 현대 프로세서는 L1에 VIPT를, 큰 크기와 안정성이 필요한 L2/L3에는 Physical Cache를 사용한다.

가상 주소Virtual CacheMMU빠름Aliasing 문제물리 주소Physical Cache안정적느림VIPTIndex: 가상Tag: 물리병렬 수행빠르고안정적초기 설계L2/L3현대 L1

주소 변환 비용을 낮추는 최적화

4KB 페이지로 큰 메모리를 사용할 때는 TLB 부담이 커진다. 1GB 메모리는 256K 페이지가 되고 TLB Miss가 빈발할 수 있으며, Page Table도 커진다. Huge Pages는 2MB와 1GB 페이지를 지원해 필요한 TLB 엔트리 수와 Page Table 크기를 줄이고 TLB Hit Rate를 높인다. 대용량 버퍼 풀을 쓰는 데이터베이스, VM 메모리, HPC, 머신러닝 프레임워크가 적용 대상이다.

Multi-level Page Table Walk도 별도 최적화 대상이다. 각 레벨마다 캐시 미스가 발생할 수 있기 때문에 Page Walk Cache로 중간 레벨 Page Table 엔트리를 캐싱하고, 일반 데이터 캐시에도 Page Table을 보관한다. 전용 하드웨어 Page Walker 역시 이 경로를 지원한다.

MMU Prefetching은 순차적 접근 패턴을 감지해 다음 페이지의 주소 변환을 미리 수행하고 TLB에 적재한다. Spatial Locality를 활용해 이후 접근의 변환 지연을 줄이는 방식이다.

MMU가상 메모리페이징TLB운영체제컴퓨터구조