콘텐츠로 바로가기

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

Sequence Core Cluster Objective & Description Evidence (BoK)
1 Address Translation 논리 주소가 물리 주소로 사상되는 변환 공식을 통해 메모리 격리와 보호의 기초 물리 메커니즘을 확립합니다. P1/Virtual Memory
2 Paging & Hierarchy 4-Level 다단계 페이지 테이블을 분해하여, 어떻게 수백 조 바이트의 가상 공간을 메모리 낭비 없이 매핑하는지 배웁니다. P1/Virtual Memory
3 Demand Paging & Swapping 메모리 부족 시 LRU 기반의 Clock 알고리즘으로 페이지를 디스크(Swap)로 내보내고 다시 불러오는 흐름을 이해합니다. Industry VM
4 Kernel Allocators & TLB 버디/슬랩 할당기로 커널 메모리 단편화를 막고, TLB 히트율을 높이기 위한 성능 최적화(Huge Pages)를 설계합니다. Industry SDM

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 변환 시뮬레이터 로직 작성.

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

Term (EN / ko, abbr) 1문장 정의 단계(기본/권장/실무/심화) 역할/맥락 관련 개념 유사/대비/함께 사용 오해 포인트 Evidence(Primary/Secondary/Industry) Flags(core/misused/legacy)
MMU CPU가 메모리에 접근할 때 가상 주소를 물리 주소로 변환해주는 하드웨어 장치입니다. 기본 하드웨어 지원 Address Translation TLB 소프트웨어 모듈로 오해 P1:CS2023/Virtual Memory core
Page Fault 요청한 페이지가 현재 물리 메모리에 없어 커널이 디스크에서 읽어와야 하는 상태입니다. 기본 예외 처리 Demand Paging Trap 치명적 오류(Crash)로 오해 P1:CS2023/Virtual Memory core
TLB 주소 변환 결과를 저장해두는 고속 하드웨어 캐시로, 메모리 접근 속도를 비약적으로 향상시킵니다. 추천 성능 최적화 Cache MMU 일반적인 L1 캐시와 동일시 Industry x86 manual core
Slab Allocator 자주 사용되는 커널 객체를 미리 할당해두고 재사용함으로써 할당 오버헤드를 줄이는 기법입니다. 실무 효율화 Buddy System Malloc 사용자 수준 할당기로 오해 Industry/Linux Kernel core

8. References

Primary References

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) 상태에 진입했는지 여부를 판별 가능한가?

OS Memory Management & Virtualization

2 / 2