๐Ÿ’ฟ KAIST:PINTOS | Concept | Memory

์ด์ˆœ๊ฐ„ยท2025๋…„ 5์›” 15์ผ

KAIST:PINTOS

๋ชฉ๋ก ๋ณด๊ธฐ
8/23

๐Ÿ“Œ Memory๋ž€?

Memory(๋ฉ”๋ชจ๋ฆฌ)๋Š” ํ”ํžˆ RAM(Random Access Memory)์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ,
ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ฝ”๋“œ, ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ์ •๋ณด ๋“ฑ ๋ชจ๋“  ์‹คํ–‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ์ €์žฅ์†Œ์ด๋‹ค.

๐Ÿ’ก CPU๊ฐ€ ์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ์ „, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋ ˆ์ง€์Šคํ„ฐ์— ์˜ฌ๋ฆฐ๋‹ค.


๐Ÿงฉ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ตฌ์กฐ

์šด์˜์ฒด์ œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ตฌ์—ญ๋ณ„๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•œ๋‹ค.

+-------------------------+
| Stack (ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ •๋ณด) |
+-------------------------+
| Heap (๋™์  ๋ฉ”๋ชจ๋ฆฌ)     |
+-------------------------+
| Data (์ „์—ญ ๋ณ€์ˆ˜ ๋“ฑ)    |
+-------------------------+
| Text (์‹คํ–‰ ์ฝ”๋“œ)       |
+-------------------------+

์ฃผ์š” ์˜์—ญ ์„ค๋ช…

๊ตฌ์—ญ์„ค๋ช…
Text์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ ์˜์—ญ
Data์ „์—ญ๋ณ€์ˆ˜, static ๋ณ€์ˆ˜ ๋“ฑ์ด ์ €์žฅ๋จ
Heapmalloc() ๋“ฑ์œผ๋กœ ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๊ณต๊ฐ„
Stackํ•จ์ˆ˜ ํ˜ธ์ถœ, ์ง€์—ญ ๋ณ€์ˆ˜ ์ €์žฅ, return address ์ถ”์  ๋“ฑ

๐Ÿ” Stack์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ๋Š˜์–ด๋‚ฌ๋‹ค๊ฐ€ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋ฉด ์ค„์–ด๋“œ๋Š” ํ›„์ž…์„ ์ถœ(LIFO) ๊ตฌ์กฐ๋‹ค.


๐Ÿง  PintOS์—์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋Š”๊ฐ€?


1. ๐Ÿงต Kernel Stack

  • PintOS์˜ ๊ฐ ์Šค๋ ˆ๋“œ(struct thread)๋Š” ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ์ปค๋„ ์Šคํƒ ๊ณต๊ฐ„์„ ๊ฐ–๋Š”๋‹ค.
  • ์ด ์Šคํƒ์€ struct thread ๋ฐ”๋กœ ์œ„์ชฝ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์œ„์น˜ํ•˜๋ฉฐ, ํ•œ ํŽ˜์ด์ง€(4KB) ํฌ๊ธฐ๋กœ ํ• ๋‹น๋œ๋‹ค.
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค return ์ฃผ์†Œ, ์ง€์—ญ ๋ณ€์ˆ˜, ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’ ๋“ฑ์ด ์—ฌ๊ธฐ์— ์Œ“์ธ๋‹ค.
  • ๋งŒ์•ฝ ๋„ˆ๋ฌด ๋งŽ์€ ํ•จ์ˆ˜๊ฐ€ ์ค‘์ฒฉ๋˜๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ํฐ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Stack Overflow)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๐Ÿงช ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๊ฐ์ง€ ๋ฐฉ์‹

  • struct thread ๋‚ด๋ถ€์— ์žˆ๋Š” uint32_t magic ๊ฐ’์ด ํŠน์ • ์ˆซ์ž(0xcd6abf4b)๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด ์žˆ๋‹ค.
  • ์Šคํƒ์ด overflow๋˜๋ฉด ์ด magic ๊ฐ’์ด ๋ฎ์–ด์“ฐ๊ธฐ ๋˜๋ฏ€๋กœ, ์ด ๊ฐ’์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ASSERT(is_thread(t)) ๊ฐ™์€ ๋งคํฌ๋กœ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ด ๊ฐ’์„ ๊ฒ€์ฆํ•œ๋‹ค.

2. ๐Ÿ“ฆ Page Allocator

  • PintOS๋Š” ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํŽ˜์ด์ง€(page) ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
    ๊ฐ ํŽ˜์ด์ง€๋Š” 4096๋ฐ”์ดํŠธ(4KB)์˜ ๊ณ ์ • ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ด๋Š” x86 ์•„ํ‚คํ…์ฒ˜์˜ ํ‘œ์ค€์ด๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ์‹œ: ํŽ˜์ด์ง€ ํ• ๋‹น๊ธฐ(palloc_get_page())๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ถ„๋ฐฐํ•œ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ์‹œ: palloc_free_page()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜๋‚ฉํ•œ๋‹ค.

๐Ÿ’ก ๊ด€๋ จ ์šฉ์–ด

์šฉ์–ด์„ค๋ช…
Free Page Pool์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋นˆ ํŽ˜์ด์ง€๋“ค์˜ ๋ฆฌ์ŠคํŠธ
Kernel Pool / User Pool์ปค๋„๊ณผ ์œ ์ € ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ณด์•ˆ ๋ฐ ์•ˆ์ •์„ฑ ํ™•๋ณด
Swap Disk๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ, ํŽ˜์ด์ง€๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•˜๋Š” ๋””์Šคํฌ ์˜์—ญ
Page-in / Page-outํŽ˜์ด์ง€๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๋‚ด๋ณด๋‚ด๋Š” ์ž‘์—… (ํ”„๋กœ์ ํŠธ 3์˜ ํ•ต์‹ฌ)

3. ๐Ÿง  Virtual Memory (P2~P3)

  • ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ œํ•œ์ ์ด๊ณ , ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ 0x0 ์ฃผ์†Œ์—์„œ ์‹œ์ž‘ํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—
    ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ(Virtual Memory)๋ฅผ ๋„์ž…ํ•œ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๊ฐ ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿง  ํ•ต์‹ฌ ๊ฐœ๋…๋“ค

์šฉ์–ด์„ค๋ช…
Virtual Addressํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋…ผ๋ฆฌ์  ์ฃผ์†Œ (ex. 0x8048000)
Physical Address์‹ค์ œ RAM์— ํ•ด๋‹นํ•˜๋Š” ์ฃผ์†Œ (ex. 0x0012F000)
Page Table๊ฐ€์ƒ ์ฃผ์†Œ๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋งคํ•‘ ๊ตฌ์กฐ
Page Fault์ฐธ์กฐํ•œ ๊ฐ€์ƒ ์ฃผ์†Œ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ
Lazy Loadingํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ , ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ๋กœ๋“œ
Memory Mapping (mmap)ํŒŒ์ผ ๋‚ด์šฉ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ๋งคํ•‘ํ•˜์—ฌ I/O ํšจ์œจ ํ–ฅ์ƒ
Stack Growth์œ ์ € ํ”„๋กœ๊ทธ๋žจ์˜ ์Šคํƒ์ด ์ ‘๊ทผ ์‹œ ์ž๋™์œผ๋กœ ํ™•์žฅ๋˜๋„๋ก ์ง€์›

โ— page_fault() ํ•ธ๋“ค๋Ÿฌ๋Š” ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋А ํŽ˜์ด์ง€์— ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์ฑ„์›Œ ๋„ฃ์„์ง€ ๊ฒฐ์ •ํ•˜๋Š” ํ•ต์‹ฌ ํ•จ์ˆ˜์ด๋‹ค.


๐Ÿงฐ ์š”์•ฝ

๊ธฐ๋Šฅ๋‚ด์šฉ
Kernel Stack์Šค๋ ˆ๋“œ๋ณ„ 4KB ์Šคํƒ, ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋Š” MAGIC ๊ฐ’์œผ๋กœ ๊ฐ์ง€
Page Allocator์ปค๋„/์œ ์ € ํ’€๋กœ ๋ถ„๋ฆฌ๋œ ํŽ˜์ด์ง€ ๋‹จ์œ„ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ
Virtual Memory๊ฐ€์ƒ ์ฃผ์†Œ, ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”, ์ง€์—ฐ ๋กœ๋”ฉ ๋“ฑ ๊ณ ๊ธ‰ ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฒ• ๊ธฐ๋ฐ˜

โฑ๏ธ ์†๋„ ๋น„๊ต

์ €์žฅ์†Œ์˜ˆ์‹œ์†๋„ (๋Œ€๋žต)
Registerrax, rsp ๋“ฑ๐ŸŸข 1 cycle
L1 CacheCPU ๋‚ด๋ถ€๐Ÿ”ต 3~4 cycle
MemoryRAM (DDR4/5)๐ŸŸ  100~300 cycle
SSDSATA/NVMe๐Ÿ”ด ์ˆ˜๋งŒ~์ˆ˜์‹ญ๋งŒ cycle

โ†’ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋น ๋ฅด๋‹ค๊ณ  ํ•˜์ง€๋งŒ ๋ ˆ์ง€์Šคํ„ฐ, ์บ์‹œ์— ๋น„ํ•˜๋ฉด ๋А๋ฆฌ๋‹ค.
๊ทธ๋ž˜์„œ Cache Miss๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํžˆ ์ €ํ•˜๋œ๋‹ค.


๐Ÿ’พ ๋ฉ”๋ชจ๋ฆฌ์™€ ๋ณ€์ˆ˜์˜ ๊ด€๊ณ„

int x = 5;
  • ๋ณ€์ˆ˜ x๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–ด๋”˜๊ฐ€์— ์ €์žฅ๋จ
  • &x๋ฅผ ํ•˜๋ฉด ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
  • CPU๋Š” ์ด ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ’์„ ๊บผ๋‚ด ์—ฐ์‚ฐ

โ†’ ๊ทธ๋ž˜์„œ C์–ธ์–ด์—์„œ ํฌ์ธํ„ฐ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


๐Ÿ“˜ ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

  • Memory๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.
  • ์Šคํƒ, ํž™, ๋ฐ์ดํ„ฐ, ์ฝ”๋“œ ๋“ฑ ๊ฐ์ข… ๊ตฌ์—ญ์ด ์กด์žฌํ•˜๋ฉฐ,
    ์ด๋ฅผ ์ดํ•ดํ•ด์•ผ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ํŽ˜์ด์ง€ ํดํŠธ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • PintOS์—์„œ๋Š” ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ๋œ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ,
    ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ/์œ ์ € ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ตฌ๋ถ„์ด ์ค‘์š”ํ•˜๋‹ค.
  • Project 2~3์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์€
    ํŽ˜์ด์ง€ ํ• ๋‹น, page fault ํ•ธ๋“ค๋ง, mmap, lazy loading, swap ๋“ฑ์˜ ๊ฐœ๋…์œผ๋กœ ํ™•์žฅ๋œ๋‹ค.
profile
์„œํˆด์ง€์–ธ์ • ๋Š˜ ํ–‰๋™์ด ๋จผ์ €์ด๊ธฐ๋ฅผ

0๊ฐœ์˜ ๋Œ“๊ธ€