Pintos lab3 virtual memory review

์กฐ์„ฑํ˜„ยท2021๋…„ 3์›” 1์ผ
0

OS

๋ชฉ๋ก ๋ณด๊ธฐ
7/9

๐Ÿ“• Virtual Memory

์ด๋ฒˆ lab3๋Š” ์ง€๋‚œ ์ฃผ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์œผ๋กœ csapp ์ฑ…๊ณผ git book์œผ๋กœ ์ „์ฒด์ ์ธ ๊ฐœ๋…์„ ๋ชจ๋‘ ์ดํ•ดํ•œ ๋’ค ์ฝ”๋”ฉ์„ ์‹œ์ž‘ํ•˜์˜€๋‹ค. ๋ฌผ๋ก  ์ฒ˜์Œ์—๋Š” ๋œฌ๊ตฌ๋ฆ„ ์žก๋Š” ์†Œ๋ฆฌ์ฒ˜๋Ÿผ ์ฝํžˆ์ง€๋งŒ, git book์—์„œ ๊ณ ์น˜๋ผ๊ณ  ํ•œ ๋ถ€๋ถ„์€ ์ผ๋‹จ pintos์— todo๋ฅผ ๋‹ฌ์•„ ๋†“์œผ๋ฉด ์ „์ฒด์ ์ธ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋†“๊ณ  ์ถœ๋ฐœํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ง€๋‚œ ์ฃผ ๊ณผ์ œ๋Š” ํŽ˜์–ด์ฝ”๋”ฉ์„ ํ–ˆ๋Š”๋ฐ, ์ด๋ฒˆ์—๋Š” ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๊ทธ๋Œ€๋กœ ํ˜ผ์ž ํ•˜๋“œ์ฝ”๋”ฉํ•˜์˜€๋‹ค. ํ•จ์ˆ˜๋งˆ๋‹ค printf()๋ฅผ ์ฐ์–ด ๋†“๊ณ  ์–ด๋–ค ์ˆœ์„œ๋กœ ์ž‘๋™๋˜๊ณ , ๋ฌด์Šจ ์—ญํ• ์ด ํ•„์š”ํ•œ์ง€ ํŒŒ์•…ํ•˜๊ณ ์ž ๋…ธ๋ ฅํ•˜์˜€๋‹ค. ํ™•์‹คํ•œ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋ฉด ์ฝ”๋”ฉํ•˜๋Š” ์†๋„๊ฐ€ ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์•„์ด๋””์–ด๋ฅผ ๋นจ๋ฆฌ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉด์„œ๋„, test case์—์„œ testํ•˜๊ณ ์ž ํ•˜๋Š” ํฌ์ธํŠธ๋„ ๋นจ๋ฆฌ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ  ๋””๋ฒ„๊น…๋„ ๋น ๋ฅด๋‹ค.

์šด์ด ์ข‹์•˜๋˜ ๊ฒŒ, ์ผ๋‹จ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐ„ ๋‹ค์Œ์— ๋ชจ๋“  ๊ตฌํ˜„์ด ๋๋‚˜๋ฉด, ํ•˜๋‚˜์”ฉ ๋ˆ„์ˆ˜๋ฅผ ์žก์•„๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•œ ๊ฒƒ์ด ์„ฑ๊ณต์ ์ด์—ˆ๋‹ค.

virtual memory๊ฐ€ pintos ์ค‘์— ๊ฐ€์žฅ ์–ด๋ ต๋‹ค๋Š” ์†Œ๋ฌธ์„ ๋“ค์—ˆ์—ˆ๋Š”๋ฐ, ๊ฑฑ์ •ํ–ˆ๋˜ ๊ฒƒ ๋ณด๋‹ค๋Š” ์–ด๋ ต์ง€๋Š” ์•Š์•˜๋‹ค. syscall ๋ณด๋‹ค ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋ฌผ๋ก  ์ง€๊ธˆ ์ฝ”๋“œ๊ฐ€ ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š๋‹ค. ๋‹ค๋ฅธ ์กฐ์—์„œ test case์—๋Š” ์—†๋Š” edge case๋ฅผ ์•Œ๋ ค์ฃผ์—ˆ๋‹ค... ์ผ๋‹จ ์ง€๊ธˆ test case์— ๋Œ€ํ•ด์„œ๋Š” ํ†ต๊ณผํ•˜๋‹ˆ๊น... todo๋กœ ๋‚จ๊ฒจ๋‘๊ณ  ๋ฆฌ๋ทฐ๋ฅผ ์“ฐ์ž...

๐Ÿ‘‰ Memory Management

๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์€ ๋งˆ์น˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•œ๊ณ„๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ illusion์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. os์˜ ์—ญํ• ์€ ์œ ์ €๊ฐ€ ์š”์ฒญํ•œ page๋ฅผ spt๋กœ ๊ด€๋ฆฌํ•˜๊ณ  frame์„ ํ†ตํ•ด ์‹ค์ œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ์ดํ›„ ํ•„์š”ํ•œ page๊ฐ€ ์žˆ์œผ๋ฉด frame๊ณผ pml4 ์—ฐ๊ฒฐ ์‹œ์ผœ์ฃผ๊ณ ,๊ฐˆ์•„ ๋ผ์›Œ์ค€๋‹ค. process ๋ณ„๋กœ spt๋ฅผ ๊ฐ€์ ธ์„œ page๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. spt๋Š” hash ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ์ด์ „๊นŒ์ง€๋Š” palloc_user_page๋ฅผ ํ†ตํ•ด ๋ฉ”๋กœ๋ฆฌ๋ฅผ ํ• ๋‹น ๋ฐ›์•„์™”๋‹ค๋ฉด, ์ด์ œ๋ถ€ํ„ฐ๋Š” get_frame()์„ ํ†ตํ•ด frame ๊ตฌ์กฐ์ฒด์™€ ํ•จ๊ป˜ ๊ด€๋ฆฌ๋˜๋„๋ก ํ•œ๋‹ค.

๐Ÿ‘‰ Anonymous Page

ํŽ˜์ด์ง€๋“ค์„ ๊ฐ type์„ ๊ฐ–๋Š”๋ฐ anonymous type์€ disk์™€ ๊ด€๋ ค์—†๋Š” stack, heap, excutable ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ์ด๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” load_segment()๋ฅผ ํ†ตํ•ด ์š”์ฒญ๋˜์ž๋งˆ์ž ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ์‹œ์ผฐ๋‹ค๋ฉด, ์ง€๊ธˆ์€ page๋งŒ ์„ ์–ธํ•ด์ฃผ๊ณ , fault๊ฐ€ ๋‚ฌ์„ ๋•Œ handler๋ฅผ ํ†ตํ•ด lazyload()๋ฅผ ํ†ตํ•ด ๋‚˜์ค‘์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ ๋น„๋กœ์†Œ frame์„ ์—ฐ๊ฒฐํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์ค€๋‹ค. lazylaod๋ฅผ ํ†ตํ•ด ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ จ์˜ ๊ณผ์ •์ด ์–ด๋–ค ์ˆœ์œผ๋กœ ์ผ์–ด๋‚˜๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ–ˆ๋‹ค.

spt๋ฅผ copyํ•ด ์ค„ ๋•Œ๋„, ์ด page๊ฐ€ ์ด๋ฏธ load๋œ ์ƒํƒœ์ธ์ง€, uninit ์ƒํƒœ์ธ์ง€ ์ž˜ ๊ตฌ๋ณ„ํ•ด์•ผ ํ•œ๋‹ค. uninit ์ƒํƒœ๋ผ๋ฉด ๋‚˜์ค‘์— load์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค๋„ aux๋ฅผ ์ƒˆ๋กœ ํ• ๋‹นํ•ด์„œ ์ž˜ ๋„˜๊ฒจ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

spt๋ฅผ killํ•ด์ค„ ๋•Œ๋Š” type๋งˆ๋‹ค ์‚ญ์ œํ•ด์•ผํ•  ๊ฒƒ์ด ๋‹ค๋ฅธ ๊ฒƒ์„ ์ธ์ง€ํ•ด์•ผํ•˜๊ณ , hash_clear()๋ฅผ ์ž˜ ์ด์šฉํ•ด์•ผํ•œ๋‹ค. ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋Œ€๋ถ€๋ถ„ ํ๋ฆ„๋“ค์ด templet์œผ๋กœ ์ž˜ ๊ตฌํ˜„๋˜์–ด์žˆ์œผ๋‹ˆ ์ž˜ ๋”ฐ๋ผ ๊ตฌํ˜„ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿ‘‰ Stack Growth

์ง€๊ธˆ๊นŒ์ง€๋Š” stack์œผ๋กœ ํ•œ page๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ดํ›„์—๋Š” stack์˜์—ญ์—์„œ page fault๊ฐ€ ๋ฐœ์ƒ์‹œ, validateํ•œ ์Šคํƒ ์˜์—ญ์—์„œ์˜ ์˜ค๋ฅ˜์ธ์ง€ ํ™•์ธํ•˜๊ณ  stack memory๋ฅผ ์ถ”๊ฐ€๋กœ ํ• ๋‹น์‹œํ‚ค๋„๋ก ๊ตฌํ˜„ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ์ ์ ˆํ•œ ๋ฒ”์œ„์ธ์ง€ rsp๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ์žˆ์—ˆ๋Š”๋ฐ ์ด ๋ถ€๋ถ„์ด ํ—ท๊ฐˆ๋ ธ์—ˆ๋‹ค.

fault_handler()์—์„œ, ํ• ๋‹น๋œ page์— ๋Œ€ํ•œ ์˜ค๋ฅ˜์ธ์ง€ ํ™•์ธํ•˜๊ณ , ๊ทธ ๋‹ค์Œ์€ ์Šคํƒ ์˜์—ญ์ธ์ง€ ํ™•์ธํ•ด์ค€๋‹ค. ์ด ๋‘ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ง„์งœ fault error๋‹ค.

๐Ÿ‘‰ Memory Mapped Files

mmap๊ณผ munmap์„ ๊ตฌํ˜„ํ•œ๋‹ค. file backed type์ด ์—ฌ๊ธฐ์— ์†ํ•œ๋‹ค. ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๋Š” ์ด์œ ๋Š” ๋” ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. anon type๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ lazy load๋กœ ๊ตฌํ˜„์„ ํ•ด์ค€๋‹ค. ์ฃผ์–ด์ง„ length์— ๋Œ€ํ•ด์„œ page์™€ ํŒŒ์ผ์„ ์ฝ์„ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ aux๋กœ ์ž˜ ์ €์žฅํ•ด์„œ ์ €์žฅํ•ด๋‘”๋‹ค. ๊ผผ๊ผผํ•˜๊ฒŒ ์งœ์•ผ์ง€ ๋‚˜์ค‘์— fork๊ฐ€ ์ผ์–ด๋‚˜๊ฑฐ๋‚˜ ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค...
munmap์„ ํ•ด์ค„ ๋•Œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ˆ˜์ •์ด ์ผ์–ด๋‚ฌ๋‹ค๋ฉด, disk์— ๋‹ค์‹œ ์ž˜ ์ €์žฅํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค... (extra์ธ cow๋ฅผ ํ•˜๋ฉด ๋” ํšจ์œจ์ ์ด๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ... ์–ด๋””๊นŒ์ง€๋‚˜ extra์ด๋‹ˆ๊น...)

๐Ÿ‘‰ Swap in/out

์ดˆ๋ฐ˜์— ๋งˆ์น˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•œ๊ณ„๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ illusion์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๋ฐ”๋กœ swap in/out ๋•๋ถ„์ด๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฝ‰์ฐจ์„œ ๋” ์ด์ƒ ํ• ๋‹น ๋ฐ›์„ ์ˆ˜ ์—†์„ ๋•Œ, ๊ธฐ์กด์˜ ๋ฉ”๋ชจ๋ฆฌ page์ค‘์—์„œ ์ •์ฑ…์— ์˜ํ•ด์„œ victim์„ ์ •ํ•ด์„œ file backed ๋ผ๋ฉด ๋‹ค์‹œ disk๋กœ, anon์ด๋ผ๋ฉด swap disk๋กœ ๋ณด๋‚ด๊ณ , ๊ทธ ์ž๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ •์ฑ…์€ cache replacement policy ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋งŽ์ด ๋‚˜์˜จ๋‹ค. ๋‚˜๋Š” LRU์— nextfit์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ด์— ํ•„์š”ํ•œ frame list๋Š” list ๋ฐ์ดํ„ฐ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , swap dick๋Š” bitmap์„ ์‚ฌ์šฉํ–ˆ๋‹ค. (extra์ธ cow๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๊ณต์œ ๋˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์šฐ์ง€ ์•Š๋„๋ก swap list๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ์ง€๊ธˆ์€ bitmap๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค.)

profile
Jazzing๐Ÿ‘จโ€๐Ÿ’ป

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