๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ด ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ํ๊ณ๋ฅผ ๋ชฐ๋ผ๋ ๋๋๋ก ์ด์์ฒด์ ๊ฐ ๊ฐ์์ ์ฃผ์ ๊ณต๊ฐ์ ์ ๊ณตํ๋ ๊ธฐ์ ์ด๋ค. ํ๋ก๊ทธ๋จ์ ์์ ๋ง์ ์ฐ์๋ ๊ฐ์ ์ฃผ์๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ค์ ๋ก๋ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ฉฐ ์ฌ์ฉํ๋ค.
๊ฐ๋จํ ๋งํด:
"์ค์ ๋ก๋ ์กฐ๊ฐ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ, ๋ง์น ๋ด ๊ฒ์ฒ๋ผ ์ฐ์๋ ๊ณต๊ฐ์ผ๋ก ์ฐ๊ฒ ํด์ฃผ๋ ์ฐฉ๊ฐ์ ๊ธฐ์ !"
์ด๋ฅผ ์ํด ์ด์์ฒด์ ๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ:
๋ฉ๋ชจ๋ฆฌ ๋ณดํธ (ํ๋ก์ธ์ค ๊ฐ ๊ฐ์ญ ๋ฐฉ์ง)
ํ๋ก๊ทธ๋จ ํฌ๊ธฐ์ ๋ฌด๊ดํ ์ ์ฐ์ฑ
๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ฌ์ฉ (ํ์ด์ง, ์ค์ํ ๋ฑ)
์ ๊ตฌํํ๋ค.
PintOS์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ(VM) ํ๋ก์ ํธ์์ ์ฐ๋ฆฌ๋ 3๊ฐ์ง ํต์ฌ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ง์ ๊ตฌํ/์ฐ๊ณํด์ผ ํ๋ค.
| ์ญํ | ์ค๋ช |
|---|---|
| ๊ฐ ์ ์ ๊ฐ์ ํ์ด์ง์ ์ํ ๊ด๋ฆฌ | ์: ๋ก๋๋์๋? ํ์ผ/์ค์์์ ๋ถ๋ฌ์์ผ ํ๋? |
| ํ์ด์ง ํดํธ ์ฒ๋ฆฌ ์ ๋ก๋ ๋ฐฉ์ ๊ฒฐ์ | ํ์ด์ง๊ฐ ์์ผ๋ฉด SPT๋ฅผ ๋ณด๊ณ ์ด๋์ ๋ถ๋ฌ์ฌ์ง ๊ฒฐ์ |
| ํ๋ก์ธ์ค๋ง๋ค ํ๋์ฉ ๊ด๋ฆฌ | ๋ ๋ฆฝ์ SPT๋ฅผ ์ฌ์ฉ, ํ๋ก์ธ์ค ์ข ๋ฃ ์ ํจ๊ป ์ ๊ฑฐ๋จ |
ํต์ฌ ๊ตฌ์กฐ์ฒด
struct page, struct supplemental_page_table
| ์ญํ | ์ค๋ช |
|---|---|
| ๋ชจ๋ ๋ฌผ๋ฆฌ ํ๋ ์์ ์ํ ๊ด๋ฆฌ | ์ด๋ค ํ๋ก์ธ์ค์ ์ด๋ค ๊ฐ์ ํ์ด์ง๊ฐ ์ฐ๊ณ ์๋์ง ์ถ์ |
| ํ๋ ์ ๋ถ์กฑ ์ Eviction ๋์ ์ฐพ๊ธฐ | ์ค์ํํ ํ๋ ์ ์ ํ (ํ์ด์ง ๊ต์ฒด ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ) |
| ์์คํ ์ ์ฒด์์ ๋จ์ผ ๊ธ๋ก๋ฒ ๊ตฌ์กฐ | ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๊ณต์ |
ํต์ฌ ํจ์
vm_get_frame(), vm_evict_frame() ๋ฑ
| ์ญํ | ์ค๋ช |
|---|---|
| ์ค์ ๊ณต๊ฐ ๊ด๋ฆฌ | ๋์คํฌ์ ์ค์ ์ฌ๋กฏ ์ฌ์ฉ ์ฌ๋ถ ์ถ์ |
| Eviction ์ ํ์ด์ง ๋ฐ์ดํฐ ์ค์์์ | ํ์ํ๋ฉด ํ์ด์ง๋ฅผ ๋์คํฌ๋ก ๋ด๋ณด๋ด๊ณ ์๋ฆฌ ํ๋ณด |
| ํ์ด์ง ์ฌ์ง์ ์ ์ค์์ธ ์ฒ๋ฆฌ | ๋ค์ ์ธ ๋ ์ค์์์ ํ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ด |
ํต์ฌ ํจ์
swap_out(), swap_in() ๋ฑ
์ ์ ํ๋ก๊ทธ๋จ ์ ๊ทผ โ ํ์ด์ง ํดํธ ์์ธ ๋ฐ์ โ page_fault() โ SPT ๊ฒ์ โ ํ์ ์ ์ค์/ํ์ผ ๋ก๋ โ ํ๋ ์ ํ ๋น โ ๋งคํ
vm.c์ page_fault()์์ ํดํธ ๋ฐ์ ์ ์ฒ๋ฆฌPintOS์์๋ ๋ณดํต ์๊ณ ์๊ณ ๋ฆฌ์ฆ(Clock Algorithm) ์ ์ฌ์ฉํด Victim ํ๋ ์์ ๊ณ ๋ฅธ๋ค.
PintOS๋ ๋ฉ๋ชจ๋ฆฌ ๋งคํ(mmap)๋ ์ง์ํ๋ค.
do_mmap(), do_munmap()์ผ๋ก ๊ตฌํ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ณด์๊ณผ ์์ ์ฑ๋ ์ค์ํ๋ค. ๋ค์์ ๋ฐฉ์ด ์ฝ๋๋ก ์ ์ ์ ๊ทผ์ ๊ฒ์ฆ:
is_user_vaddr(ptr) : ์ ์ ์์ญ์ธ์ง ํ์ธpml4_get_page() : ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ํ์ธexit(-1)๋ก ์ข
๋ฃ| ํ ์คํธ ์ผ์ด์ค | ๊ฒ์ฆ ๊ธฐ๋ฅ |
|---|---|
anon | ์ต๋ช ํ์ด์ง (zero ํ์ด์ง) |
mmap, mmap-close | ๋ฉ๋ชจ๋ฆฌ ๋งคํ |
swap, swap-anon | ์ค์์ธ/์ค์์์ ๋์ ํ์ธ |
page-fault | ํ์ด์ง ํดํธ ์ฒ๋ฆฌ (SPT/Swap ์ฐ๊ณ) |
bad-*, access-* | ์๋ชป๋ ์ ๊ทผ ์ฒ๋ฆฌ, SPT ์ ํจ์ฑ ๊ฒ์ฌ ๋ฑ |
fork-* | fork ์ SPT ๋ณต์ฌ ๋ฐ ๊ณต์ ์ฌ๋ถ ํ์ธ |