Memory(๋ฉ๋ชจ๋ฆฌ)๋ ํํ RAM(Random Access Memory)์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ,
ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ์ฝ๋, ๋ณ์, ํจ์ ์ ๋ณด ๋ฑ ๋ชจ๋ ์คํ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์ ์ฅ์์ด๋ค.
๐ก CPU๊ฐ ์ฐ์ฐ์ ํ๊ธฐ ์ , ๋ฉ๋ชจ๋ฆฌ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ ์ง์คํฐ์ ์ฌ๋ฆฐ๋ค.
์ด์์ฒด์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ตฌ์ญ๋ณ๋ก ๋๋์ด ๊ด๋ฆฌํ๋ค.
+-------------------------+
| Stack (ํจ์ ํธ์ถ ์ ๋ณด) |
+-------------------------+
| Heap (๋์ ๋ฉ๋ชจ๋ฆฌ) |
+-------------------------+
| Data (์ ์ญ ๋ณ์ ๋ฑ) |
+-------------------------+
| Text (์คํ ์ฝ๋) |
+-------------------------+
| ๊ตฌ์ญ | ์ค๋ช |
|---|---|
| Text | ์ค์ ํ๋ก๊ทธ๋จ ์ฝ๋๊ฐ ์ ์ฅ๋ ์์ญ |
| Data | ์ ์ญ๋ณ์, static ๋ณ์ ๋ฑ์ด ์ ์ฅ๋จ |
| Heap | malloc() ๋ฑ์ผ๋ก ๋์ ์ผ๋ก ํ ๋น๋๋ ๊ณต๊ฐ |
| Stack | ํจ์ ํธ์ถ, ์ง์ญ ๋ณ์ ์ ์ฅ, return address ์ถ์ ๋ฑ |
๐ Stack์ ํจ์ ํธ์ถ ์๋ง๋ค ๋์ด๋ฌ๋ค๊ฐ ํจ์๊ฐ ๋๋๋ฉด ์ค์ด๋๋ ํ์ ์ ์ถ(LIFO) ๊ตฌ์กฐ๋ค.
struct thread)๋ ๊ณ ์ ๋ ํฌ๊ธฐ์ ์ปค๋ ์คํ ๊ณต๊ฐ์ ๊ฐ๋๋ค.struct thread ๋ฐ๋ก ์์ชฝ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์์นํ๋ฉฐ, ํ ํ์ด์ง(4KB) ํฌ๊ธฐ๋ก ํ ๋น๋๋ค.struct thread ๋ด๋ถ์ ์๋ uint32_t magic ๊ฐ์ด ํน์ ์ซ์(0xcd6abf4b)๋ก ์ด๊ธฐํ๋์ด ์๋ค.magic ๊ฐ์ด ๋ฎ์ด์ฐ๊ธฐ ๋๋ฏ๋ก, ์ด ๊ฐ์ ๊ฒ์ฌํ์ฌ ์ค๋ฅ๋ฅผ ๊ฐ์งํ ์ ์๋ค.ASSERT(is_thread(t)) ๊ฐ์ ๋งคํฌ๋ก๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ด ๊ฐ์ ๊ฒ์ฆํ๋ค.palloc_get_page())๋ฅผ ํตํด ํ์ด์ง ๋จ์๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ถ๋ฐฐํ๋ค.palloc_free_page()๋ฅผ ํธ์ถํ์ฌ ํ์ด์ง๋ฅผ ๋ฐ๋ฉํ๋ค.| ์ฉ์ด | ์ค๋ช |
|---|---|
| Free Page Pool | ์ฌ์ฉ ๊ฐ๋ฅํ ๋น ํ์ด์ง๋ค์ ๋ฆฌ์คํธ |
| Kernel Pool / User Pool | ์ปค๋๊ณผ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ตฌ๋ถํ์ฌ ๋ณด์ ๋ฐ ์์ ์ฑ ํ๋ณด |
| Swap Disk | ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋, ํ์ด์ง๋ฅผ ์์๋ก ์ ์ฅํ๋ ๋์คํฌ ์์ญ |
| Page-in / Page-out | ํ์ด์ง๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ฐ์ ธ์ค๊ฑฐ๋ ๋ด๋ณด๋ด๋ ์์ (ํ๋ก์ ํธ 3์ ํต์ฌ) |
| ์ฉ์ด | ์ค๋ช |
|---|---|
| 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 | ๊ฐ์ ์ฃผ์, ํ์ด์ง ํ ์ด๋ธ, ์ง์ฐ ๋ก๋ฉ ๋ฑ ๊ณ ๊ธ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฒ ๊ธฐ๋ฐ |
| ์ ์ฅ์ | ์์ | ์๋ (๋๋ต) |
|---|---|---|
| Register | rax, rsp ๋ฑ | ๐ข 1 cycle |
| L1 Cache | CPU ๋ด๋ถ | ๐ต 3~4 cycle |
| Memory | RAM (DDR4/5) | ๐ 100~300 cycle |
| SSD | SATA/NVMe | ๐ด ์๋ง~์์ญ๋ง cycle |
โ ๋ฉ๋ชจ๋ฆฌ๋ ๋น ๋ฅด๋ค๊ณ ํ์ง๋ง ๋ ์ง์คํฐ, ์บ์์ ๋นํ๋ฉด ๋๋ฆฌ๋ค.
๊ทธ๋์ Cache Miss๊ฐ ๋ฐ์ํ๋ฉด ์ฑ๋ฅ์ด ๊ธ๊ฒฉํ ์ ํ๋๋ค.
int x = 5;
x๋ ๋ฉ๋ชจ๋ฆฌ ์ด๋๊ฐ์ ์ ์ฅ๋จ&x๋ฅผ ํ๋ฉด ํด๋น ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์โ ๊ทธ๋์ C์ธ์ด์์ ํฌ์ธํฐ๊ฐ ์ค์ํ ์ด์ ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ง์ ๋ค๋ฃฐ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.