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 | ์ต์ข ํ์ด์ง ํ ์ด๋ธ |
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๋จ๊ณ ํ์ด์ง ํ ์ด๋ธ์ ์์ฐจ์ ์ผ๋ก ํ์ํ๋ค:
- CR3 ๋ ์ง์คํฐ โ PML4 ํ ์ด๋ธ ๊ธฐ๋ฐ ์ฃผ์ ํ๋
- PML4[VPN[47:39]] โ PDPT ๊ธฐ๋ฐ ์ฃผ์
- PDPT[VPN[38:30]] โ PD ๊ธฐ๋ฐ ์ฃผ์
- PD[VPN[29:21]] โ PT ๊ธฐ๋ฐ ์ฃผ์ ๋๋ 2MB huge page ์ง์ ๋งคํ
- PT[VPN[20:12]] โ ๋ฌผ๋ฆฌ ํ๋ ์ ๋ฒํธ (PFN) + ํ๋๊ทธ
- ๋ฌผ๋ฆฌ ์ฃผ์ = PFN ร ํ์ด์ง ํฌ๊ธฐ + ์คํ์ [11:0]
์์ ์ํธ๋ฆฌ์ huge page ๋นํธ๊ฐ ์ค์ ๋ผ ์์ผ๋ฉด page walk๋ PMD(2MB) ๋๋ PUD(1GB) ๋ ๋ฒจ์์ ์กฐ๊ธฐ์ ์ข ๋ฃ๋ ์ ์๋ค. ์ด ๊ฒฝ์ฐ ํ์ PT๋ฅผ ์๋ตํ๋ฏ๋ก TLB reach์ page walk ๋น์ฉ ์ธก๋ฉด์์ ์ ๋ฆฌํ์ง๋ง, ๋จํธํ์ ํ ๋น ์ ์ฝ์ด ์ปค์ง๋ค.
4๋จ๊ณ: ํ์ด์ง ํดํธ ์ฒ๋ฆฌ
present ๋นํธ๊ฐ 0์ด๋ฉด ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๋ค. OS ์ปค๋์ do_page_fault() ํจ์๊ฐ ํธ์ถ๋์ด:
- faulting ์ฃผ์์ ์ ๊ทผ ์ ํ(์ฝ๊ธฐ/์ฐ๊ธฐ/์คํ) ํ์ธ
- ํด๋น ํ๋ก์ธ์ค์ VMA ๋ชฉ๋ก์์ ์ฃผ์ ๋ฒ์ ๊ฒ์
- ์ ํจํ VMA์ธ ๊ฒฝ์ฐ: ๋ฌผ๋ฆฌ ํ๋ ์ ํ ๋น โ ๋์คํฌ I/O โ ๋งคํ ๊ฐฑ์
- ์ ํจํ์ง ์์ ๊ฒฝ์ฐ: SIGSEGV ์๊ทธ๋ ๋ฐ์
5๋จ๊ณ: Copy-on-Write (COW)
fork() ์ ์์ ํ๋ก์ธ์ค๋ ๋ถ๋ชจ์ ํ์ด์ง ํ
์ด๋ธ์ ๊ณต์ ํ์ง๋ง, ์ฐ๊ธฐ ์ ๊ทผ ์์๋ง ๋ณต์ฌ๊ฐ ์ํ๋๋ค:
- fork() ํธ์ถ ์ ๋ชจ๋ ํ์ด์ง๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์
- ์์ ๋๋ ๋ถ๋ชจ๊ฐ ์ฐ๊ธฐ ์ ๊ทผ ์ ํ์ด์ง ํดํธ ๋ฐ์
- ํธ๋ค๋ฌ๊ฐ ํ์ด์ง๋ฅผ ๋ณต์ฌํ๊ณ ์์ชฝ ํ๋ก์ธ์ค์ ๋งคํ์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐฑ์
- ์ด๋ฅผ ํตํด 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 ๊ฐ์ ๊ธฐ๋ฒ์ด ํจ๊ป ๋์ํด ์ฑ๋ฅ๊ณผ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ๋์์ ์ต์ ํํ๋ค.