๐Ÿ–ฅ๏ธ System

Virtual Memory

๊ฐœ์š”

Virtual Memory๋Š” ๊ฐ ํ”„๋กœ์„ธ์Šค์— ๋…๋ฆฝ๋œ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„(Virtual Address Space)์„ ์ œ๊ณตํ•˜์—ฌ, ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ œ์•ฝ์œผ๋กœ๋ถ€ํ„ฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ฒ•์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹ค์ œ ํฌ๊ธฐ์™€ ์œ„์น˜์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ˜„๋Œ€ ์šด์˜์ฒด์ œ์˜ ๊ทผ๊ฐ„์„ ์ด๋ฃจ๋Š” ๊ธฐ์ˆ ๋กœ, ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ, ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์  ์‚ฌ์šฉ, ๋™์  ํ• ๋‹น, ๋ฉ”๋ชจ๋ฆฌ ๋งตํ•‘ ํŒŒ์ผ ๋“ฑ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. CPU๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  ์ฃผ์†Œ๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ์ด๋ฉฐ, MMU(Memory Management Unit) ํ•˜๋“œ์›จ์–ด์— ์˜ํ•ด ๋ฌผ๋ฆฌ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ์ด ๊ณผ์ •์—์„œ TLB, page-walk cache, huge page ๊ฐ™์€ ๋ณด์กฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•จ๊ป˜ ๋™์ž‘ํ•ด ์ฃผ์†Œ ๋ณ€ํ™˜ ์ง€์—ฐ์„ ์ค„์ธ๋‹ค.

ํ•ต์‹ฌ ๊ฐœ๋…

๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„ (Virtual Address Space)

๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ์ ์ธ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ 64๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋งค์šฐ ํฐ ์ฃผ์†Œ ๋ฒ”์œ„๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. x86-64์—์„œ๋Š” ์˜ค๋žซ๋™์•ˆ 48๋น„ํŠธ canonical address๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์ตœ๊ทผ CPU์™€ ์ปค๋„์€ 5-level paging(LA57)์„ ํ†ตํ•ด 57๋น„ํŠธ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„๊นŒ์ง€ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒ์œ„ ๋น„ํŠธ๋Š” sign extension ๊ทœ์น™์„ ๋”ฐ๋ผ canonical form์„ ์ด๋ค„์•ผ ํ•˜๋ฏ€๋กœ, ํ•˜๋“œ์›จ์–ด๊ฐ€ ์ž˜๋ชป๋œ ์ฃผ์†Œ๋ฅผ ์ดˆ๊ธฐ์— ๊ฑธ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

  • Kernel Space: OS ์ปค๋„์ด ์‚ฌ์šฉํ•˜๋Š” ์ƒ์œ„ ์˜์—ญ (์ผ๋ฐ˜์ ์œผ๋กœ 0xFFFF800000000000~)
  • User Space: ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ•˜์œ„ ์˜์—ญ (0x0000000000000000~0x7FFFFFFFFFFF)

ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” (Page Table)

๊ฐ€์ƒ ์ฃผ์†Œ๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ํ˜„๋Œ€ CPU๋Š” 4๋‹จ๊ณ„ ๊ณ„์ธต์  ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”(Hierarchical Page Table)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. Linux ์ปค๋„์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ณ„์ธต ์ด๋ฆ„์œผ๋กœ PGD/P4D/PUD/PMD/PTE๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์‹ค์ œ ํ•˜๋“œ์›จ์–ด ๋‹จ๊ณ„ ์ˆ˜๊ฐ€ ์ ์œผ๋ฉด ์ค‘๊ฐ„ ๋ ˆ๋ฒจ์„ foldingํ•ด ๊ฐ™์€ ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

x86-64 4๋‹จ๊ณ„ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ:

๋ ˆ๋ฒจ ์ด๋ฆ„ ๋น„ํŠธ ์ˆ˜ ์—”ํŠธ๋ฆฌ ์ˆ˜ ์—ญํ• 
4 PML4 (Page Map Level 4) 9๋น„ํŠธ 512 ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ
3 PDPT (Page Directory Pointer Table) 9๋น„ํŠธ 512 ์ค‘๊ฐ„ ๋””๋ ‰ํ† ๋ฆฌ
2 PD (Page Directory) 9๋น„ํŠธ 512 ํŽ˜์ด์ง€ ๋””๋ ‰ํ† ๋ฆฌ
1 PT (Page Table) 9๋น„ํŠธ 512 ์ตœ์ข… ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”
Virtual Address Translation

Linux๋Š” ์ด๋ฅผ PGD/P4D/PUD/PMD/PTE ๊ณ„์ธต์œผ๋กœ ์ถ”์ƒํ™”ํ•˜๋ฉฐ, ํ•˜๋“œ์›จ์–ด์— ๋”ฐ๋ผ ์ค‘๊ฐ„ ๋ ˆ๋ฒจ์ด folding๋  ์ˆ˜ ์žˆ๋‹ค. 5-level paging์ด ํ™œ์„ฑํ™”๋œ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋” ์–•์€ ๊ตฌ์กฐ ๋Œ€์‹  ํ•œ ๋‹จ๊ณ„๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ๋” ํฐ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๋‹ค๋ฃฌ๋‹ค.

TLB (Translation Lookaside Buffer)

ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ๋ณ€ํ™˜์„ ๊ฐ€์†ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์บ์‹œ์ด๋‹ค. MMU ๋‚ด๋ถ€์— ์œ„์น˜ํ•˜๋ฉฐ, ์ตœ๊ทผ ์‚ฌ์šฉ๋œ ๊ฐ€์ƒโ†’๋ฌผ๋ฆฌ ์ฃผ์†Œ ๋งคํ•‘์„ ์ €์žฅํ•œ๋‹ค.

  • TLB ๊ตฌ์กฐ: ์ผ๋ฐ˜์ ์œผ๋กœ fully associative ๋˜๋Š” set-associative
  • TLB ํฌ๊ธฐ: CPU ์„ธ๋Œ€์™€ ์ฝ”์–ด ์„ค๊ณ„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค
  • ์ง€์—ฐ ์‹œ๊ฐ„: TLB hit์€ ๋งค์šฐ ๋น ๋ฅด๊ณ , miss ์‹œ์—๋Š” page walk๊ฐ€ ํ•„์š”ํ•ด ํ›จ์”ฌ ๋А๋ ค์ง„๋‹ค
  • ASID/PCID: ํ”„๋กœ์„ธ์Šค ์ „ํ™˜ ์‹œ TLB flush๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ์‹๋ณ„์ž
  • Page-walk cache: ์ƒ์œ„ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ํ•ญ๋ชฉ์„ ๋‹ค์‹œ ์ฝ๋Š” ๋น„์šฉ์„ ์ค„์—ฌ์ค€๋‹ค
  • TLB shootdown: ๋‹ค๋ฅธ ์ฝ”์–ด์˜ ์˜ค๋ž˜๋œ ๋ณ€ํ™˜ ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”์–ด ๊ฐ„ ๋™๊ธฐํ™”

ํŽ˜์ด์ง€ ํดํŠธ (Page Fault)

๊ฐ€์ƒ ์ฃผ์†Œ์— ํ•ด๋‹นํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ์—†์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํŠธ๋žฉ์ด๋‹ค. ํ•˜๋“œ์›จ์–ด ํŠธ๋žฉ ํ›„ OS ์ปค๋„์˜ ํŽ˜์ด์ง€ ํดํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค.

ํŽ˜์ด์ง€ ํดํŠธ ์ฒ˜๋ฆฌ ๊ณผ์ •:
1. MMU๊ฐ€ ๊ฐ€์ƒ ์ฃผ์†Œ ๋ณ€ํ™˜ ์‹œ present ๋น„ํŠธ๊ฐ€ 0์ธ ์—”ํŠธ๋ฆฌ ๋ฐœ๊ฒฌ
2. CPU๊ฐ€ Trap #14 (Page Fault) ๋ฐœ์ƒ
3. ํ•ธ๋“ค๋Ÿฌ๊ฐ€ CR2 ๋ ˆ์ง€์Šคํ„ฐ์—์„œ faulting ์ฃผ์†Œ ํš๋“
4. VMA(Virtual Memory Area)์—์„œ ํ•ด๋‹น ์ฃผ์†Œ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
5. ์œ ํšจํ•œ ๊ฒฝ์šฐ: ๋ฌผ๋ฆฌ ํ”„๋ ˆ์ž„ ํ• ๋‹น โ†’ ํŽ˜์ด์ง€ ๋กœ๋“œ โ†’ TLB ๊ฐฑ์‹ 
6. ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ: SEGFAULT ์‹œ๊ทธ๋„ ์ „๋‹ฌ

ํŽ˜์ด์ง€ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฐ€๋“ ์ฐผ์„ ๋•Œ ์–ด๋–ค ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒดํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค:

  • LRU (Least Recently Used): ๊ฐ€์žฅ ์˜ค๋ž˜์ „์— ์ ‘๊ทผ๋œ ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒด. ์ด์ƒ์ ์ด๋‚˜ ๊ตฌํ˜„ ๋น„์šฉ์ด ๋†’๋‹ค.
  • CLOCK (Second Chance): reference bit๋ฅผ ํ™œ์šฉํ•œ ๊ทผ์‚ฌ LRU ๊ณ„์—ด ๊ธฐ๋ฒ•. ์—ฌ๋Ÿฌ ์šด์˜์ฒด์ œ์˜ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋กœ ๋„๋ฆฌ ์“ฐ์ธ๋‹ค.
  • NFU (Not Frequently Used): ์ ‘๊ทผ ๋นˆ๋„๋ฅผ ์ถ”์ ํ•˜์—ฌ ๊ต์ฒด ๋Œ€์ƒ ์„ ํƒ
  • Optimal: ๋ฏธ๋ž˜ ์ ‘๊ทผ ํŒจํ„ด์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ด์ƒ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (์—ฐ๊ตฌ์šฉ)

Linux๋Š” ์ „ํ†ต์ ์ธ active/inactive LRU์™€ ์ตœ๊ทผ์˜ Multi-Gen LRU(MGLRU)์ฒ˜๋Ÿผ LRU ๊ทผ์‚ฌ ๊ณ„์—ด ์ •์ฑ…์„ ์กฐํ•ฉํ•ด reclaim ํšจ์œจ๊ณผ ์Šค์บ” ๋น„์šฉ ์‚ฌ์ด๋ฅผ ์ ˆ์ถฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ต์ฒด ์ •์ฑ…์€ ๋‹จ์ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•˜๋‚˜๋ผ๊ธฐ๋ณด๋‹ค, ์ฐธ์กฐ ์ด๋ ฅ๊ณผ reclaim ๋น„์šฉ์„ ํ•จ๊ป˜ ๊ณ ๋ คํ•˜๋Š” ์šด์˜์ฒด์ œ ์ •์ฑ… ์ง‘ํ•ฉ์œผ๋กœ ์ดํ•ดํ•˜๋Š” ํŽธ์ด ์ •ํ™•ํ•˜๋‹ค.

๋น„๊ต/๋ถ„์„

4๋‹จ๊ณ„ vs 5๋‹จ๊ณ„ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”

๊ตฌ๋ถ„ ์ผ๋ฐ˜์  x86-64 5-level paging
์ฃผ์†Œ ๋ฒ”์œ„ 48-bit canonical 57-bit canonical
๋ ˆ๋ฒจ PML4 โ†’ PDPT โ†’ PD โ†’ PT PML5 โ†’ PML4 โ†’ PDPT โ†’ PD โ†’ PT
๋ชฉ์  ์ผ๋ฐ˜์ ์ธ ์„œ๋ฒ„/๋ฐ์Šคํฌํ†ฑ ๋งค์šฐ ํฐ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„ ์ง€์›
์ ์šฉ ๋„๋ฆฌ ์‚ฌ์šฉ ์ง€์› CPU์™€ ์ปค๋„์—์„œ ์„ ํƒ์  ์‚ฌ์šฉ

ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ์—”ํŠธ๋ฆฌ ๋น„ํŠธ ํ•„๋“œ (x86-64)

๋น„ํŠธ ์ด๋ฆ„ ์„ค๋ช…
0 Present ํŽ˜์ด์ง€๊ฐ€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๋Š”์ง€
1 Read/Write ์“ฐ๊ธฐ ํ—ˆ์šฉ ์—ฌ๋ถ€ (0: ์ฝ๊ธฐ ์ „์šฉ)
2 User/Supervisor ์‚ฌ์šฉ์ž ๋ชจ๋“œ ์ ‘๊ทผ ํ—ˆ์šฉ ์—ฌ๋ถ€
3 Page-Level Write-Through ์ง๋ ฌ ์“ฐ๊ธฐ ๋™์ž‘
4 Page-Level Cache Disable ์บ์‹ฑ ๋น„ํ™œ์„ฑํ™”
5 Accessed ํ•ด๋‹น ํŽ˜์ด์ง€์— ์ ‘๊ทผ ์ด๋ ฅ
6 Dirty ํ•ด๋‹น ํŽ˜์ด์ง€์— ์“ฐ๊ธฐ ์ด๋ ฅ
7 Page Size 0: 4KB ํŽ˜์ด์ง€, 1: huge page
8~11 Global TLB์—์„œ ์ „์—ญ ์œ ํšจ (ํ”„๋กœ์„ธ์Šค ์ „ํ™˜ ์‹œ flush ์•ˆ ํ•จ)
12~51 Physical Address ๋ฌผ๋ฆฌ ํ”„๋ ˆ์ž„ ๋ฒˆํ˜ธ (PFN)
52~62 Reserved/Software OS ์ž„์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
63 XD (Execute Disable) ์‹คํ–‰ ๋ถˆ๊ฐ€ ๋น„ํŠธ (NX ๋น„ํŠธ)

ํŽ˜์ด์ง€ ํฌ๊ธฐ ๋น„๊ต

ํŽ˜์ด์ง€ ํฌ๊ธฐ ์‚ฌ์šฉ์ฒ˜ ์žฅ์  ๋‹จ์ 
4KB (ํ‘œ์ค€) ์ผ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์„ธ๋ฐ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ TLB ์ปค๋ฒ„๋ฆฌ์ง€ ์ž‘์Œ
2MB (Huge) ๋Œ€์šฉ๋Ÿ‰ ๋ฉ”๋ชจ๋ฆฌ TLB ๋ฏธ์Šค ๊ฐ์†Œ, ๋ณ€ํ™˜ ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ์†Œ ๋‚ด๋ถ€ ๋‹จํŽธํ™”
1GB (Giga) ๋งค์šฐ ํฐ ํ• ๋‹น ์ตœ์†Œ ์˜ค๋ฒ„ํ—ค๋“œ ๋‚ด๋ถ€ ๋‹จํŽธํ™” ์‹ฌ๊ฐ

ํŽ˜์ด์ง€ ํดํŠธ ์œ ํ˜•

์œ ํ˜• ์›์ธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•
Minor (Soft) ํŽ˜์ด์ง€๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ์œผ๋‚˜ ๋งคํ•‘ ์•ˆ ๋จ ๋งคํ•‘๋งŒ ์ถ”๊ฐ€ (I/O ๋ถˆํ•„์š”)
Major (Hard) ํŽ˜์ด์ง€๊ฐ€ ๋””์Šคํฌ์— ์žˆ์Œ ๋””์Šคํฌ์—์„œ ๋กœ๋“œ (I/O ํ•„์š”, ๋А๋ฆผ)
Invalid ์ž˜๋ชป๋œ ์ฃผ์†Œ ์ ‘๊ทผ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ (SIGSEGV)

TLB ๋ฏธ์Šค ์ฒ˜๋ฆฌ ๊ฒฝ๋กœ ๋น„๊ต

๊ฒฝ๋กœ ํ•ต์‹ฌ ๋™์ž‘ ์„ฑ๋Šฅ ์˜ํ–ฅ ์ž์ฃผ ์“ฐ๋Š” ์™„ํ™” ๋ฐฉ๋ฒ•
TLB Hit TLB์—์„œ ์ฆ‰์‹œ PFN ํš๋“ ๊ฐ€์žฅ ๋น ๋ฆ„ locality ์œ ์ง€
TLB Miss + Page-walk cache hit ์ƒ์œ„ ์—”ํŠธ๋ฆฌ ์ผ๋ถ€๋ฅผ ์บ์‹œ์—์„œ ์žฌ์‚ฌ์šฉ ์ค‘๊ฐ„ ์ˆ˜์ค€ ์ง€์—ฐ huge page, ์ •๋ ฌ๋œ ์ ‘๊ทผ
TLB Miss + Full page walk ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ๋‹จ๊ณ„๋ณ„๋กœ ๋ชจ๋‘ ํƒ์ƒ‰ ์ง€์—ฐ ์ฆ๊ฐ€ THP, page-walk cache, PCID
TLB Miss + Page Fault ์ปค๋„ ์ง„์ž… ํ›„ ๋งคํ•‘ ์ƒ์„ฑ/๋ณต๊ตฌ ๊ฐ€์žฅ ํผ prefetch, ์ถฉ๋ถ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ, ์Šค์™€ํ•‘ ์–ต์ œ

๋™์ž‘ ์›๋ฆฌ

1๋‹จ๊ณ„: ๊ฐ€์ƒ ์ฃผ์†Œ ์ƒ์„ฑ

CPU๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด, ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋œ ๊ฐ€์ƒ ์ฃผ์†Œ๊ฐ€ MMU์— ์ „๋‹ฌ๋œ๋‹ค. ๊ฐ€์ƒ ์ฃผ์†Œ๋Š” 48๋น„ํŠธ(์ผ๋ฐ˜์ )์ด๋ฉฐ, ๊ฐ 9๋น„ํŠธ์”ฉ 4๊ฐœ์˜ ์ธ๋ฑ์Šค์™€ 12๋น„ํŠธ ์˜คํ”„์…‹์œผ๋กœ ๋ถ„ํ• ๋œ๋‹ค.

2๋‹จ๊ณ„: TLB ์กฐํšŒ

MMU๋Š” ๋จผ์ € TLB์—์„œ ๊ฐ€์ƒ ์ฃผ์†Œ์˜ ๋งคํ•‘์„ ์ฐพ๋Š”๋‹ค. 4๋‹จ๊ณ„ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ํƒ์ƒ‰ ์—†์ด TLB hit์ด๋ฉด ์ฆ‰์‹œ ๋ฌผ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์–ป๋Š”๋‹ค. ํ˜„๋Œ€ ํ”„๋กœ์„ธ์„œ์˜ TLB hit๋ฅ ์€ 99% ์ด์ƒ์ด๋‹ค.

3๋‹จ๊ณ„: ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ํƒ์ƒ‰ (TLB Miss)

TLB miss๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•˜๋“œ์›จ์–ด(๋˜๋Š” OS ์†Œํ”„ํŠธ์›จ์–ด)๊ฐ€ 4๋‹จ๊ณ„ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค:

  1. CR3 ๋ ˆ์ง€์Šคํ„ฐ โ†’ PML4 ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜ ์ฃผ์†Œ ํš๋“
  2. PML4[VPN[47:39]] โ†’ PDPT ๊ธฐ๋ฐ˜ ์ฃผ์†Œ
  3. PDPT[VPN[38:30]] โ†’ PD ๊ธฐ๋ฐ˜ ์ฃผ์†Œ
  4. PD[VPN[29:21]] โ†’ PT ๊ธฐ๋ฐ˜ ์ฃผ์†Œ ๋˜๋Š” 2MB huge page ์ง์ ‘ ๋งคํ•‘
  5. PT[VPN[20:12]] โ†’ ๋ฌผ๋ฆฌ ํ”„๋ ˆ์ž„ ๋ฒˆํ˜ธ (PFN) + ํ”Œ๋ž˜๊ทธ
  6. ๋ฌผ๋ฆฌ ์ฃผ์†Œ = PFN ร— ํŽ˜์ด์ง€ ํฌ๊ธฐ + ์˜คํ”„์…‹[11:0]

์ƒ์œ„ ์—”ํŠธ๋ฆฌ์˜ huge page ๋น„ํŠธ๊ฐ€ ์„ค์ •๋ผ ์žˆ์œผ๋ฉด page walk๋Š” PMD(2MB) ๋˜๋Š” PUD(1GB) ๋ ˆ๋ฒจ์—์„œ ์กฐ๊ธฐ์— ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํ•˜์œ„ PT๋ฅผ ์ƒ๋žตํ•˜๋ฏ€๋กœ TLB reach์™€ page walk ๋น„์šฉ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•˜์ง€๋งŒ, ๋‹จํŽธํ™”์™€ ํ• ๋‹น ์ œ์•ฝ์ด ์ปค์ง„๋‹ค.

4๋‹จ๊ณ„: ํŽ˜์ด์ง€ ํดํŠธ ์ฒ˜๋ฆฌ

present ๋น„ํŠธ๊ฐ€ 0์ด๋ฉด ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. OS ์ปค๋„์˜ do_page_fault() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด:

  1. faulting ์ฃผ์†Œ์™€ ์ ‘๊ทผ ์œ ํ˜•(์ฝ๊ธฐ/์“ฐ๊ธฐ/์‹คํ–‰) ํ™•์ธ
  2. ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ VMA ๋ชฉ๋ก์—์„œ ์ฃผ์†Œ ๋ฒ”์œ„ ๊ฒ€์ƒ‰
  3. ์œ ํšจํ•œ VMA์ธ ๊ฒฝ์šฐ: ๋ฌผ๋ฆฌ ํ”„๋ ˆ์ž„ ํ• ๋‹น โ†’ ๋””์Šคํฌ I/O โ†’ ๋งคํ•‘ ๊ฐฑ์‹ 
  4. ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ: SIGSEGV ์‹œ๊ทธ๋„ ๋ฐœ์ƒ

5๋‹จ๊ณ„: Copy-on-Write (COW)

fork() ์‹œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ์˜ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ๊ณต์œ ํ•˜์ง€๋งŒ, ์“ฐ๊ธฐ ์ ‘๊ทผ ์‹œ์—๋งŒ ๋ณต์‚ฌ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค:

  1. fork() ํ˜ธ์ถœ ์‹œ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ค์ •
  2. ์ž์‹ ๋˜๋Š” ๋ถ€๋ชจ๊ฐ€ ์“ฐ๊ธฐ ์ ‘๊ทผ ์‹œ ํŽ˜์ด์ง€ ํดํŠธ ๋ฐœ์ƒ
  3. ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ์–‘์ชฝ ํ”„๋กœ์„ธ์Šค์˜ ๋งคํ•‘์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐฑ์‹ 
  4. ์ด๋ฅผ ํ†ตํ•ด fork()์˜ ์‹œ๊ฐ„/๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์„ ๋Œ€ํญ ์ ˆ๊ฐ

6๋‹จ๊ณ„: ๋ฉ”๋ชจ๋ฆฌ ๋งตํ•‘ ํŒŒ์ผ (mmap)

ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ง์ ‘ ๋งคํ•‘ํ•˜์—ฌ, ํŒŒ์ผ I/O๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค:

  • mmap() ํ˜ธ์ถœ ์‹œ ํŒŒ์ผ์˜ ๊ฐ€์ƒ ์ฃผ์†Œ ์˜์—ญ์— ๋Œ€ํ•œ VMA ์ƒ์„ฑ
  • ์‹ค์ œ ๋ฌผ๋ฆฌ ํ”„๋ ˆ์ž„ ํ• ๋‹น์€ ์ ‘๊ทผ ์‹œ์ ( demand paging )์— ์ˆ˜ํ–‰
  • msync()๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋””์Šคํฌ์— ๋ฐ˜์˜
  • munmap()์œผ๋กœ ๋งคํ•‘ ํ•ด์ œ

ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋งคํ•‘์€ page cache์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋ฏ€๋กœ, ๊ฐ™์€ ํŒŒ์ผ ํŽ˜์ด์ง€๋ฅผ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด anonymous memory๋Š” ํŒŒ์ผ ๋ฐฑ์—”๋“œ ์—†์ด swap ๋˜๋Š” reclaim ์ •์ฑ…์˜ ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—, page fault์™€ reclaim ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์ „๊ฐœ๋œ๋‹ค.

์žฅ๋‹จ์ 

์žฅ์  ๋‹จ์ 
ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ๊ฒฉ๋ฆฌ ๋ฐ ๋ณด์•ˆ ํŽ˜์ด์ง€ ํดํŠธ ์˜ค๋ฒ„ํ—ค๋“œ (ํŠนํžˆ major fault)
๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ํฐ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ TLB miss ์‹œ 4๋‹จ๊ณ„ ๋ณ€ํ™˜ ๋น„์šฉ
ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ  (shared memory, COW) ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ์ž์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ
๋™์  ํ• ๋‹น ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์••์ถ• ํ•˜๋“œ์›จ์–ด ์ง€์› ํ•„์š” (MMU, TLB)
๋ฉ”๋ชจ๋ฆฌ ๋งตํ•‘ ํŒŒ์ผ๋กœ I/O ํšจ์œจํ™” ์‹ค์‹œ๊ฐ„ ์‹œ์Šคํ…œ์—์„œ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ์ง€์—ฐ
์Šค์™€ํ•‘์œผ๋กœ ํฐ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ๊ฐ€๋Šฅ ์Šค์™€ํ•‘ ๊ณผ๋‹ค ์‹œ thrashing ์œ„ํ—˜

๊ด€๋ จ ๊ธฐ์ˆ 

  • CPU Cache Architecture: ์บ์‹œ ๊ณ„์ธต๊ณผ TLB miss์˜ ์ฒด๊ฐ ๋น„์šฉ
  • Memory Hierarchy: locality์™€ ๊ณ„์ธตํ˜• ์ €์žฅ ์žฅ์น˜์˜ ๋ฐฐ๊ฒฝ
  • Linux Memory Tiering Deep: NUMA์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต ์ด๋™
  • VFS FS PageCache BlockIO: page cache์™€ file-backed mmap ๊ฒฝ๋กœ
  • Intel SDM Vol. 3A: Paging ๊ตฌ์กฐ ๋ฐ TLB ๊ด€๋ฆฌ์˜ ๊ณต์‹ ์‚ฌ์–‘
  • ARMv8 Translation: ARM ์•„ํ‚คํ…์ฒ˜์˜ 2~4๋‹จ๊ณ„ ๊ฐ€๋ณ€ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”
  • Linux Kernel mm/: ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์„œ๋ธŒ์‹œ์Šคํ…œ ๊ตฌํ˜„ (mmap, page fault, swap)
  • Linux Kernel Page Tables ๋ฌธ์„œ: 5-level hierarchy, folding, huge page ๋งคํ•‘ ์„ค๋ช…
  • Huge Pages / Transparent Huge Pages (THP): TLB ํšจ์œจ์„ฑ์„ ์œ„ํ•œ ๋Œ€ํ˜• ํŽ˜์ด์ง€ ๊ธฐ๋ฒ•
  • KSM (Kernel Same-page Merging): ๋™์ผํ•œ ํŽ˜์ด์ง€๋ฅผ ๊ณต์œ ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์ค‘๋ณต ์ œ๊ฑฐ
  • NUMA-aware Paging: ๋น„๊ท ์ผ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์‹œ์Šคํ…œ์—์„œ์˜ ํŽ˜์ด์ง€ ํ• ๋‹น ์ตœ์ ํ™”
  • ARM CCA (Confidential Compute Architecture): ํ•˜๋“œ์›จ์–ด ๊ธฐ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ๊ฒฉ๋ฆฌ ๊ธฐ์ˆ 

ํ•ต์‹ฌ ์ •๋ฆฌ

Virtual Memory๋Š” ํ”„๋กœ์„ธ์Šค๋ณ„ ๋…๋ฆฝ๋œ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ฒฉ๋ฆฌ์™€ ํšจ์œจ์  ๊ณต์œ ๋ฅผ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” OS์˜ ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ๊ณ„์ธต์  ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”, TLB, page-walk cache์˜ ์กฐํ•ฉ์€ ๋ณ€ํ™˜ ์ง€์—ฐ์„ ์ค„์ด๋ฉด์„œ ๋Œ€๊ทœ๋ชจ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์‹ค์šฉ์ ์œผ๋กœ ๋งŒ๋“ ๋‹ค. ํŽ˜์ด์ง€ ํดํŠธ ๊ธฐ๋ฐ˜์˜ demand paging์€ ์ดˆ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ , Copy-on-Write๋Š” fork() ๋น„์šฉ์„ ํฌ๊ฒŒ ๋‚ฎ์ถ˜๋‹ค. ํ˜„๋Œ€ ์‹œ์Šคํ…œ์—์„œ๋Š” Huge Pages, THP, PCID, NUMA-aware paging, MGLRU ๊ฐ™์€ ๊ธฐ๋ฒ•์ด ํ•จ๊ป˜ ๋™์ž‘ํ•ด ์„ฑ๋Šฅ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ ๋™์‹œ์— ์ตœ์ ํ™”ํ•œ๋‹ค.