Memory Management & Virtualization Physics
물리적 메모리의 한계를 넘어선 가상 주소 공간의 추상화와 페이징, 세그멘테이션 및 하드웨어 가속 기술을 다루는 학습 노드입니다.
Article
M
Me
hyunyoun's Blog
operating-systems-system-mechanicsoperating-systemssystem-mechanicsmemory-managementvirtualization-physicsos-memory-managementvirtualizationlearning9 min read
1. Overview
메모리 관리 및 가상화 물리(Memory Management & Virtualization Physics, MMVP)는 제한된 용량과 파편화된 물리적 RAM 자원을 여러 프로세스가 독립적인 연속 주소 공간처럼 사용할 수 있게 만드는 운영체제의 메모리 추상화를 다룹니다.
초창기 단순한 베이스/리미트 레지스터 방식을 넘어, 현대 운영체제는 CPU 내부의 MMU(Memory Management Unit) 하드웨어와 협력하여 가상 주소를 물리 주소로 실시간 매핑(Mapping)합니다. 학습자는 4KB 페이지(Page) 단위로 메모리를 나누어 외부 파편화를 줄이는 페이징 아키텍처, 이를 다단계 테이블로 구성하는 계층 구조, 그리고 속도 병목을 줄이는 TLB(Translation Lookaside Buffer) 캐싱 메커니즘을 학습합니다. 더불어 요구 페이징(Demand Paging)과 페이지 교체(Replacement) 알고리즘을 통해, 실제 RAM 용량을 넘는 워크로드를 디스크의 스왑(Swap) 영역과 함께 운영하는 가상 메모리 구조를 이해합니다.
2. Scope & Boundaries
In-Scope
- 주소 변환 하드웨어 물리 (Address Translation): 가상 주소(VA)에서 물리 주소(PA)로의 사상 메커니즘, MMU의 페이지 테이블 워크(Page Table Walk), 내부/외부 파편화 물리.
- 페이징 아키텍처 (Paging Systems): 4-Level 다단계 페이지 테이블(x86_64), 역페이지 테이블(Inverted Page Table), 거대 페이지(Huge Pages).
- 성능 가속과 하드웨어 캐싱: TLB(Translation Lookaside Buffer)의 히트/미스 사이클, TLB 플러시 오버헤드, Copy-on-Write(CoW) 최적화.
- 커널/유저 메모리 할당기: 유저 랜드의
malloc내부 구조(Free List, brk/mmap), 커널 랜드의 버디 시스템(Buddy System) 및 슬랩 할당기(Slab Allocator). - 가상화 코어 및 스와핑 (Virtualization): 요구 페이징(Demand Paging) 트랩, 페이지 폴트(Page Fault) 핸들링, LRU/Clock 등 페이지 교체(Replacement) 알고리즘, 스래싱(Thrashing).
Out-of-Scope
- 어플리케이션 가비지 컬렉션(GC) 구현: Java JVM이나 V8 엔진 내부의 Mark-and-Sweep, 세대별(Generational) 가비지 수집 알고리즘 → 05. Programming Languages 영역으로 위임.
- 영구 저장 장치 I/O 스택 및 파일 시스템: 디스크 스케줄링, 아이노드(inode), 저널링 복구 구조 → 03-04. Storage & I/O Mechanics 영역으로 위임.
- CPU 캐시 일관성 하드웨어 회로: L1/L2 캐시의 MESI 프로토콜 회로망 설계 → 02-03. Parallel Mechanics 영역으로 위임.
Boundaries
- MMVP vs. Architecture (02): Architecture 영역이 SRAM과 DRAM 소자가 어떻게 캐시를 구성하고 대역폭을 내는지 같은 하드웨어 자체에 집중한다면, MMVP는 그 하드웨어 위에서 4KB 단위 블록을 통해 여러 가상 주소 공간을 만들고 서로의 접근을 보호하는 운영체제의 통제 구조에 집중합니다.
3. Counterexample
malloc()을 즉시 물리 RAM 할당으로 오해: C 언어에서malloc()을 호출하면 운영체제 커널이 항상 즉시 물리 RAM을 배정한다고 생각하는 것은 MMVP의 중요한 오해입니다. 실제로는malloc라이브러리(사용자 레벨)가 미리 커널로부터 큰 영역(brk,mmap)을 받아두고 그 안에서 나누어 주는 경우가 많으며, 메모리를 할당받아도 실제 쓰기(Write)가 발생하기 전까지는 물리 RAM이 배정되지 않는 요구 페이징(Demand Paging)의 지연 할당(Lazy Allocation)이 적용될 수 있습니다.- TLB와 페이지 테이블 구조의 간과: "메모리가 16GB이고 여유가 있으니 무조건 성능이 좋을 것이다"라고 단정하면 안 됩니다. 넓은 메모리 영역을 무작위로 접근하는 빅데이터 연산에서는 TLB 캐시 미스(Miss)가 급증해 MMU가 페이지 테이블을 자주 탐색하고 CPU 사이클을 많이 사용할 수 있습니다. 이런 병목을 줄이기 위해 Huge Pages(2MB/1GB 단위)를 적용할 수 있습니다.
4. Prerequisites
- 디지털 논리 및 프로세서 물리 (Basic): 폰 노이만 아키텍처의 주소 버스(Address Bus)와 데이터 버스의 비트(Bit) 개념 이해가 필수적입니다. (02-01. DLP)
- 커널 및 시스템 인터페이스 (Recommended): 페이지 폴트가 발생할 때 운영체제 커널이 트랩(Trap)을 잡아 어떻게 핸들링하는지 컨텍스트 전환에 대한 지식이 요구됩니다. (03-01. KSIP)
5. Learning Map
6. Learning Topics
Basic
Core Topic 01: 가상 메모리와 주소 변환 물리 (Virtual Memory & Translation)
- Why to Learn: 프로그램이 컴파일될 때 자신이 메모리의 어느 물리적 위치에 로드될지 알 수 없어도, 독립적인 주소 공간(0x0000...)에서 실행될 수 있게 하는 격리 기술을 이해하기 위해서입니다.
- What to Learn:
- Concepts: 논리 주소(Virtual Address) vs 물리 주소(Physical Address), 내부 파편화(Internal) vs 외부 파편화(External Fragmentation), 베이스 및 바운드 레지스터(Base and Bound).
- Skills: 세그멘테이션(Segmentation) 모델에서 발생하는 거대한 여백 공간 문제(외부 파편화) 분석.
- Tools:
objdump,readelf를 통한 바이너리 텍스트/데이터 섹션 가상 주소 관측. - Trade-offs: 프로세스마다 격리된 주소 공간을 보장해 안정성을 높이는 장점 vs 주소 변환을 위해 레지스터나 메모리를 한 번 더 거쳐야 하는 오버헤드 간의 타협.
- How to Learn:
- 1단계: 세그멘테이션 방식에서 크기가 제각각인 메모리 덩어리를 할당하고 해제하는 과정을 그림으로 그려, 중간중간 쓸 수 없는 구멍이 생기는 외부 파편화의 한계를 직관적으로 이해합니다.
- 2단계: 이를 해결하기 위해 메모리를 일정한 4KB 단위(Page)로 쪼개는 페이징 모델을 도입하고, 32비트 환경에서 가상 주소를 오프셋(Offset)과 페이지 번호(VPN) 비트로 분리하는 계산식을 실습합니다.
- Implement: 특정 가상 주소(Hex)가 주어지면, 내부적으로 하드코딩된 페이지 테이블(배열)을 참조하여 오프셋을 더해 최종 물리 주소(Hex)를 리턴하는 단순 MMU 변환 시뮬레이터 로직 작성.
Recommended
Core Topic 02: 페이징 아키텍처와 계층적 보호 (Paging Architecture)
- Why to Learn: 64비트 시스템의 방대한 주소 공간 전체에 대한 매핑 테이블을 생성하면 그 자체로 메모리가 낭비되므로, 공간의 밀도를 최적화하는 다단계 구조를 설계하기 위해서입니다.
- What to Learn:
- Concepts: 다단계 페이지 테이블(Multi-level Page Table), 페이지 디렉토리(Page Directory), Copy-on-Write(CoW), 공유 라이브러리.
- Skills: x86_64 아키텍처의 4단계(PML4 -> PDPT -> PD -> PT) 트리 워크(Tree Walk) 메모리 오버헤드 산출 및
fork()시의 페이지 공유 메커니즘 분석. - Tools: 리눅스
/proc/pid/maps,pmap명령어. - Trade-offs: 단일 페이지 테이블 방식은 테이블 크기가 GB 단위까지 커질 수 있지만 구조가 단순합니다. 다단계 페이징은 사용하지 않는 주소 영역의 테이블을 만들지 않아 공간을 절약하지만, 주소 변환 과정에서 추가 메모리 접근이 필요할 수 있습니다.
- How to Learn:
- 1단계: 32비트 프로세스 공간에서 단일 테이블(항목당 4B)을 만들 때 페이지 테이블 자체가 4MB를 차지함을 계산하고, 2단계 디렉토리 방식을 쓰면 빈 공간에 대해 메모리를 아예 할당하지 않는 원리를 그림으로 입증합니다.
- 2단계:
fork()시스템 콜 직후 부모와 자식이 같은 물리 페이지를 공유(Read-Only)하다가, 둘 중 하나가 쓰기를 시도하는 순간 Page Fault가 발생해 새로운 페이지로 복사(CoW)되는 영리한 최적화를 분석합니다.
- Implement: C/C++로 다단계 가상 메모리 트리를 구현하여, 데이터를 저장할 때만 리프 노드(페이지)를 동적 할당하여 메모리 오버헤드를 줄이는 페이지 테이블 모델링 스크립트.
Practical
Core Topic 03: 요구 페이징과 스와핑 역학 (Demand Paging & Swapping)
- Why to Learn: 사용 중인 여러 프로그램의 요구량이 실제 물리 RAM 용량(예: 8GB)을 훨씬 초과하더라도, 마치 100GB 램이 있는 것처럼 디스크와 데이터를 맞교환하며 시스템을 무중단 구동하기 위함입니다.
- What to Learn:
- Concepts: 요구 페이징(Demand Paging), 페이지 폴트(Page Fault), 페이지 교체(Replacement) 알고리즘(FIFO, LRU, Clock), 스래싱(Thrashing), 워킹 셋(Working Set) 모델.
- Skills: 메모리 압박(Memory Pressure) 상황에서 OOM(Out of Memory) 킬러 작동 전의 스왑 인/아웃(Swap in/out) 디스크 I/O 시퀀스 추적.
- Tools:
vmstat,free, 리눅스 커널 소스(kswapd). - Trade-offs: 스왑 구역을 활용해 RAM 한계를 초과하는 애플리케이션을 구동시키는 이득 vs SSD/HDD I/O 대기 시간에 발목이 잡혀 CPU가 놀게 되는 최악의 스래싱(Thrashing) 성능 저하 늪.
- How to Learn:
- 1단계: 어떤 페이지를 디스크로 내쫓을지 결정하는 알고리즘 중, 완벽하지만 런타임 오버헤드가 큰 LRU(Least Recently Used) 대신, 참조 비트(Reference Bit)만 순회하며 빠르게 검사하는 Clock(Second Chance) 알고리즘의 실무적 타당성을 분석합니다.
- 2단계:
vmstat명령어를 켜놓고 RAM 크기 이상의 10GB 짜리 거대 2차원 배열을 무작위 접근하는 C 코드를 돌려,si(Swap In),so(Swap Out) 수치가 치솟으며 시스템이 마비되는 스래싱 현상을 직접 체험합니다.
- Implement: 일정한 프레임 크기 제한 하에서 무작위 페이지 참조 스트링이 들어올 때, FIFO, LRU, Clock 방식이 각각 몇 번의 페이지 폴트를 유발하는지 비교 출력하는 교체 알고리즘 시뮬레이터.
Advanced
Core Topic 04: 커널 할당기와 TLB 하드웨어 최적화 (Kernel Allocators & TLB)
- Why to Learn: 운영체제 자체의 커널 메모리 효율을 높이고, 대규모 클라우드 데이터베이스 인프라에서 하드웨어 주소 변환 병목(TLB Miss)을 줄이기 위해서입니다.
- What to Learn:
- Concepts: TLB(Translation Lookaside Buffer), 거대 페이지(Huge Pages / Transparent Huge Pages), 버디 시스템(Buddy System), 슬랩 할당기(Slab Allocator), NUMA(Non-Uniform Memory Access).
- Skills: 버디 할당기의 분할/병합(Split/Merge) 이진 트리 역학, TLB 미스율(Miss Rate)이 프로세서 파이프라인에 미치는 지연(Latency) 계산.
- Tools:
perf프로파일러의 TLB 미스 이벤트 측정. - Trade-offs: 2MB 단위의 거대 페이지(Huge Pages)를 사용하면 1개의 TLB 슬롯으로 더 넓은 메모리 범위를 커버할 수 있습니다. 대신 일부 바이트만 사용해도 2MB 전체가 할당되므로 내부 파편화(Internal Fragmentation)가 커질 수 있습니다.
- How to Learn:
- 1단계: 캐시 크기가 64개인 TLB에 4KB 페이지를 쓰면 256KB 공간만 빠르게 변환할 수 있지만, 2MB 거대 페이지를 쓰면 128MB 공간의 주소 변환을 TLB hit로 처리할 수 있음을 계산합니다.
- 2단계: 커널 공간에서 네트워크 소켓, inode 구조체 등 특정 크기의 데이터 구조물을 반복 생성·해제할 때 발생하는 파편화를, 슬랩 할당기(Slab Allocator)가 객체 크기별 캐시를 두고 재사용하는 방식으로 줄이는 구조를 분석합니다.
- Implement: 2의 거듭제곱 크기 단위로만 메모리를 쪼개어 할당하고, 인접한 블록(Buddy)이 둘 다 해제(Free)되면 다시 더 큰 블록으로 병합시키는 버디 할당기(Buddy Memory Allocator)의 트리 관리 엔진 C 로직 작성.
7. Terminology
8. References
Primary References
- [P1] CS2023 - OS/Virtual Memory — Address translation and paging.
- [P2] SWEBOK - Computing Foundations — Memory hierarchy and management.
Secondary References
- [Operating Systems: Three Easy Pieces] Remzi H. Arpaci-Dusseau — The "Virtualization" part is excellent.
- [A Guide to Kernel Memory Allocators] — Deep dive into Slab/Slob/Slub history.
Industry References
- [Intel 64 and IA-32 Architectures Software Developer's Manual Volume 3] — System programming guide.
- [Linux Kernel Memory Management Documentation] — Official implementation details.
9. Final Checklist
Primary Checklist
- 주소 변환 과정에서 다단계 페이지 테이블이 단일 테이블 대비 메모리를 아끼는 원리를 계산해 설명 가능한가? (P1)
- 페이지 폴트 발생 시 하드웨어 트랩부터 디스크 I/O 후 복귀까지의 처리 시퀀스를 재구성할 수 있는가? (P1)
Secondary Checklist
- 내부 파편화와 외부 파편화가 시스템 성능과 가용 용량에 미치는 영향을 구분하여 인지하는가?
- Copy-on-Write 메커니즘이
fork()시스템 콜의 성능을 어떻게 개선하는지 이해하는가?
Industry Checklist
- 프로젝트 환경에서 Huge Pages를 설정했을 때 TLB 미스율 변화와 애플리케이션 지연 시간 간의 상관관계를 분석할 수 있는가? (SFIA)
-
/proc/meminfo데이터를 해석하여 시스템이 스와핑(Swapping) 상태에 진입했는지 여부를 판별 가능한가?