๐ŸŒŒ[Pintos] 3-2. VIRTUAL MEMORY

์ด๊ฐ•์šฑยท2022๋…„ 12์›” 12์ผ
8

๐ŸŒŒ Pintos

๋ชฉ๋ก ๋ณด๊ธฐ
4/6
post-thumbnail
post-custom-banner

์„ธ ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚ฌ๋‹ค.
์ง€๊ธˆ๊ณผ ๋‚˜์ค‘์„ ์œ„ํ•ด ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์•Œ๊ฒŒ๋œ ๊ฒƒ๋“ค์„ ์ ์–ด๋‘”๋‹ค.

์ด๋ฒˆ์ฃผ์˜ ์ฃผ์š” ํ‚ค์›Œ๋“œ

lazy load (demand paging)

ํ”„๋กœ์„ธ์Šค๊ฐ€ load ๋  ๋•Œ, ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์ง€๋Š” memory segment (code(or text), data, bss, heap, stack) ๋“ค์€ ๊ณง ๋ฐ”๋กœ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ(DRAM)์— ๋ฐฐ์ •๋˜์ง€ ์•Š๋Š”๋‹ค. ์‹ค์ œ๋กœ๋Š” ๊ทธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ(page)์„ ์š”๊ตฌํ•  ๋•Œ(demand), ๊ทธ์ œ์„œ์•ผ kernel์€ ํ˜„์žฌ ๊ฐ€์šฉํ•œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์˜ ์˜์—ญ(frame)์„ ํ•˜๋‚˜ ์ฐพ์€ ํ›„, loadํ•  ๋•Œ ๊ตฌ์„ฑํ•ด ๋‘์—ˆ๋˜ page table์„ ๊ฐ€์ง€๊ณ  ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์–ด์ค€๋‹ค.

์ข€ ๋” ์ •ํ™•ํžˆ ๋งํ•˜์ž๋ฉด, kernel์€ ํ”„๋กœ์„ธ์Šค์˜ ์š”๊ตฌ(demand)๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ธฐ ๋ณด๋‹ค๋Š”, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ผ์œผํ‚จ ์˜ค๋ฅ˜ (fault)๋ฅผ ์ฒ˜๋ฆฌํ•ด ์ค€๋‹ค. ํ”„๋กœ์„ธ์Šค์˜ ์ˆ˜ํ–‰์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ ‘๊ทผํ•˜๊ฒŒ ๋  ๊ฒƒ์ธ๋ฐ, ํ•ด๋‹น ์˜์—ญ์€ ์•„์ง ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐฐ์ •๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ์ ‘๊ทผ์€ page fault๋ผ๋Š” interrupt๋ฅผ (ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ) ์ผ์œผํ‚จ๋‹ค. ์ด ๋•Œ kernel mode์— ์ง„์ž…ํ•˜๊ฒŒ ๋˜๋ฉด์„œ, kernel์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผํ•˜๊ณ ์ž ํ–ˆ๋˜ ๊ฐ€์ƒ ์ฃผ์†Œ๋ฅผ CR2 register์—์„œ ์ฝ์€ ํ›„ (ํ•˜๋“œ์›จ์–ด๊ฐ€ ์ ์–ด์ค€๋‹ค), ๊ทธ ํ”„๋กœ์„ธ์Šค์˜ page table์„ ์ฐธ๊ณ ํ•ด ๊ทธ์ œ์„œ์•ผ ๋ฌผ๋ฆฌ๋ฉ”๋ชจ๋ฆฌ์— lazy ํ•˜๊ฒŒ load ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ ๋งŒํผ์„ ์‹ค์ œ ๋ฌผ๋ฆฌ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ํ• ๋‹นํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” storage ๊ณต๊ฐ„์„ ํ™œ์šฉํ•˜๋Š” swap ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ํ•˜๋ฉด์„œ (๋’ค์—์„œ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค), OS๊ฐ€ ์ž์‹ ์˜ key role ์ค‘์˜ ํ•˜๋‚˜์ธ Sharing (ํŠนํžˆ, space sharing)์„ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

mmap

kernel์ด mmap system call์„ ๋ฐ›์œผ๋ฉด, ์š”์ฒญ ํŒŒ์ผ์˜, ์š”์ฒญ offset์—์„œ ์‹œ์ž‘ํ•˜๋Š”, ์š”์ฒญ ํฌ๊ธฐ๋งŒํผ์˜ ์—ฐ์†๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„(๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์—ฐ์†๋  ํ•„์š”๋Š” ์—†๋‹ค. ์–ด์ฐจํ”ผ page ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—.), ์š”์ฒญ ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ํ• ๋‹นํ•ด ์ค€๋‹ค. ์ด ๋•Œ ๋˜ํ•œ demand paging์ด ์ ์šฉ๋˜์–ด mmap ํ˜ธ์ถœ๋งŒ์œผ๋กœ๋Š” ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ํŒŒ์ผ ๋‚ด์šฉ์ด ์ ํžˆ์ง€ ์•Š๊ณ , ํ”„๋กœ์„ธ์Šค๊ฐ€ ์š”๊ตฌํ•ด์•ผ๋งŒ (fault๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ๋งŒ) ๊ทธ์ œ์„œ์•ผ ํŒŒ์ผ์„ ์ฝ์–ด์„œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์–ด์ค€๋‹ค.

mmap system call์€ file system์— ๋Œ€ํ•œ ์ผ์ข…์˜ interface๋ผ๊ณ ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ mmap์œผ๋กœ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— writeํ•˜๋ฉด ๊ทธ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์‹ค์ œ๋กœ storage์˜ file์— ์ €์žฅ(write-back) ๋œ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ read ๋˜๋Š” write๋ฅผ ํ•˜์ง€ ์•Š๊ณ ๋„ file์— ๋Œ€ํ•œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ €์žฅ๋˜๋Š” ์ˆœ๊ฐ„์€, ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ munmap system call์„ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, ํ•ด๋‹น ์˜์—ญ์— ํฌํ•จ๋œ page๊ฐ€ swap out ๋˜๊ฑฐ๋‚˜ (๋’ค์—์„œ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค), ๋ช…์‹œ์  munmap ํ˜ธ์ถœ ์—†์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ์ด๋‹ค.

swap in/out

Memory swapping ์€ ์•ž์„œ ์–ธ๊ธ‰๋œ space sharing์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•์œผ๋กœ, storage์˜ ๊ณต๊ฐ„์„ ํ™œ์šฉํ•œ๋‹ค. demand paging์„ ํ†ตํ•ด ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ ํŽ˜์ด์ง€๋“ค์ด ๋“ค์–ด ์ฐฐํ…๋ฐ, demand๊ฐ€ ๊ฐ์ง€๋˜์—ˆ์„ ๋•Œ ๋ฌผ๋ฆฌ๋ฉ”๋ชจ๋ฆฌ์— ๋” ์ด์ƒ ํŽ˜์ด์ง€๋ฅผ ๋ฐฐ์ •ํ•ด ์ค„ ์ˆ˜ ์—†๋‹ค๋ฉด, ๊ฐ€์žฅ ์˜ค๋ž˜ ์ ‘๊ทผ๋˜์ง€ ์•Š์€ page(victim page: ํฌ์ƒ์ž ํŽ˜์ด์ง€)๋ฅผ ๊ณจ๋ผ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ storage๋กœ evict(swap out)ํ•œ๋‹ค. ํฌ์ƒ์ž ํŽ˜์ด์ง€์˜ type (anonymous memory vs file-backed memory)์— ๋”ฐ๋ผ swap out๋˜๋Š” ๊ณต๊ฐ„(backing storage)์ด ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค (swap dist vs backing file).

๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ swap out ๋œ page์— ๋Œ€ํ•˜์—ฌ ๋‹ค์‹œ demand๊ฐ€ ๊ฐ์ง€๋œ๋‹ค๋ฉด, ๊ทธ๋•Œ ๊ทธ page๋ฅผ swap in ํ•œ๋‹ค. ์ฆ‰, storage์— ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฝ์–ด ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์–ด์ค€๋‹ค. ์ฐธ๊ณ ๋กœ ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ process ์˜ memory๊ฐ€ ํ†ต์งธ๋กœ swap out ๋˜์ง€ ์•Š์Œ์„ ์œ ์˜ํ•˜์ž. page ๋‹จ์œ„๋กœ swap in/out ์ด ์ผ์–ด๋‚œ๋‹ค.

CSAPP์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์— ๋Œ€ํ•˜์—ฌ "๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋””์Šคํฌ์— ๋Œ€ํ•œ ์บ์‹œ" ๋ผ๊ณ  ์ •์˜ํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํ•ญ์ƒ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋งจ ์ฒ˜์Œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋””์Šคํฌ์—์„œ ๊ทธ ํŒŒ์ผ์„ ์ฝ์–ด์˜ค๋Š” ์ž‘์—…์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•จ์„ ๋– ์˜ฌ๋ ค๋ณด๋ฉด, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด์„œ ์ฝ๊ณ  ์“ฐ๋Š” ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋””์Šคํฌ์— ์žˆ๋‹ค๋Š” ๊ด€์ ์œผ๋กœ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค (๋„คํŠธ์›Œํฌ ํ†ต์‹  ์ œ์™ธ). ๊ทธ๋ž˜์„œ ํ”„๋กœ์„ธ์Šค๋Š” storage๋ฅผ ์ง์ ‘ ์ฝ๊ณ  ์“ฐ๋ฉฐ ์ž‘์—…ํ•˜๊ณ  ์‹ถ์ง€๋งŒ, disk I/O๋Š” ๋งค์šฐ ๋Š๋ฆฌ๋‹ค. ๋”ฐ๋ผ์„œ "๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋””์Šคํฌ์— ๋Œ€ํ•œ ์บ์‹œ"์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด swap in/out์„ ํ™œ์šฉํ•œ๋‹ค๊ณ  ์ดํ•ดํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.

๋‚˜๋ฅผ ์ž  ๋ชป ๋“ค๊ฒŒ ํ•œ ์งˆ๋ฌธ๋“ค

์ด๋ฒˆ ์ฃผ์ฐจ๋Š” ํŠนํžˆ ๋™๊ธฐ ํ˜•๋“ค๋กœ๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ ์œ ์ตํ•œ ์งˆ๋ฌธ๋“ค์„ ๋งŽ์ด ๋“ฃ๊ณ , ๊ฐ™์ด ์ƒ๊ฐํ•ด๋ณด๋Š” ์‹œ๊ฐ„์ด ๋งŽ์•˜๋‹ค. ๊ฐ๊ฐ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

Anonymous vs File-backed (by prodyou and jw3215)

"code segment๋ž‘ data segment๋Š” ๋ถ„๋ช…ํžˆ ์‹คํ–‰ ํŒŒ์ผ์—์„œ ์ฝ์–ด์˜ค์ž–์•„,
๊ทผ๋ฐ ์™œ anonymous memory๋กœ type์„ ์ง€์ •ํ•ด์ฃผ์ง€?"

pintos๋Š” process๋ฅผ loadํ•  ๋•Œ, ํ•ด๋‹น๋˜๋Š” executable file์—์„œ segment๋“ค์„ ์ฝ์–ด์„œ page table์— ๊ธฐ๋กํ•œ๋‹ค (pintos์˜ ๊ตฌํ˜„ ์ƒ์œผ๋กœ ์ •ํ™•ํžˆ๋Š” Supplemental page table(spt)์— ๊ธฐ๋ก).

vm_alloc_page_with_initializer ๊ฐ€ ๋ฐ”๋กœ segment์˜ page ๋“ค์„ ๊ฐ๊ฐ spt์— ๋“ฑ๋กํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๊ทผ๋ฐ ์งˆ๋ฌธ์ฒ˜๋Ÿผ page์˜ type์„ file-backed memory์— ํ•ด๋‹นํ•˜๋Š” VM_FILE์ด ์•„๋‹Œ, VM_ANON์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ๋“ฑ๋กํ•œ๋‹ค.

์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์™œ ๊ตณ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ anonymous memory์™€ file-backed memory๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๋Š”์ง€๋ฅผ ๋จผ์ € ์•Œ์•„์•ผ ํ•œ๋‹ค. ๋‘˜์˜ ์ฐจ์ด์ ์€ (๋„ˆ๋ฌด๋‚˜ ๋‹น์—ฐํ•˜์ง€๋งŒ) ์ด๋ฆ„์—์„œ๋ถ€ํ„ฐ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ๋‘˜์˜ ์ด๋ฆ„์€ ๊ฐ๊ฐ ๊ทธ๋“ค์ด swap out ๋˜๋Š” ๊ณต๊ฐ„์ธ backing store ์˜ ์ด๋ฆ„๊ณผ ๊ฐ™๋‹ค. anonymous memory๋Š” disk์˜ swap disk์— ์กด์žฌํ•˜๋Š” ์ต๋ช…์˜ file์—, file-backed memory๋Š” disk์— ์กด์žฌํ•˜๋Š” ์ž์‹ ์˜ ์›๋ž˜ file์— swap out ๋œ๋‹ค.

์‚ฌ์‹ค ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ anonymous memory๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ฆ‰, ๋ชจ๋“  swap out์„ swap disk๋ฅผ ํ–ฅํ•˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, ์›๋ž˜ ๊ทธ ๋ฉ”๋ชจ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ์ •๋ณด๋ฅผ ์ง€๋‹Œ file์ด disk์— ์กด์žฌํ•œ๋‹ค๋ฉด ์ด๋Š” swap disk๋ผ๋Š” ๊ณต๊ฐ„์ž์›์˜ ๋‚ญ๋น„์ด๋‹ค. ๋”๋ถˆ์–ด, anonymous memory๋Š” swap out ์‹œ ํ•„์—ฐ์ ์œผ๋กœ write back ์ด ์ผ์–ด๋‚œ๋‹ค. ๋‹ค์‹œ ์š”๊ตฌ๊ฐ€ ๊ฐ์ง€๋˜์–ด swap in ๋˜์–ด์•ผ ํ•  ๋•Œ๊นŒ์ง€ ๊ทธ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด ๋‘์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ file-backed memory์˜ swap out์€ ๋ฐ˜๋“œ์‹œ write back์„ ํฌํ•จํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ์ด๋ฏธ disk ์ƒ์— ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด๋‘” file์ด ๋ฏธ๋ฆฌ ์กด์žฌํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ์—, write back์„ ํ•ด๋‘์ง€ ์•Š์•„๋„ ๋‹ค์Œ ์š”๊ตฌ๊ฐ€ ๊ฐ์ง€๋˜์—ˆ์„ ๋•Œ ๊ทธ file์„ ์ฝ์–ด ๋ฐ”๋กœ swap in์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹จ, swap out๋˜๋Š” ์‹œ์ ์—์„œ ๊ทธ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ (== modified == dirty), ํ•ด๋‹น file์— write backํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ swap out๋œ ์‹œ์ ์˜ ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ„์งํ•œ ์ฑ„ ์ดํ›„์— swap in ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ์œ ๋…ํ•˜๋ฉด์„œ ๋‹ค์‹œ pintos์˜ ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด์ž. load_segment๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” segment๋Š” ๋‘ ๊ฐ€์ง€ ์ธ๋ฐ, code segment์™€ data segment๊ฐ€ ๊ทธ๊ฒƒ์ด๋‹ค. code segment๋Š” ๋ง๊ทธ๋Œ€๋กœ ์ˆ˜ํ–‰๋  ์ฝ”๋“œ (cpu๊ฐ€ ์ฝ๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” binary)๊ฐ€ ์ ํ˜€์žˆ์„ ๊ฒƒ์ด๊ณ , data segment๋Š” ๊ทธ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋“ค์˜ ์ •๋ณด๊ฐ€ ์ ํ˜€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์งˆ๋ฌธ์˜ ์š”์ง€๋Š” file์—์„œ ์ฝ์–ด์™”๋Š”๋ฐ ์™œ file-backed memory๊ฐ€ ์•„๋‹ˆ๋ƒ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

์•„๊นŒ ์–ธ๊ธ‰ํ•œ ๋‘ memory type์˜ ์ฐจ์ด๋ฅผ ๋‹ค์‹œ ๋– ์˜ฌ๋ ค ๋ณด์ž. -> backing store์˜ ์ฐจ์ด.
์‚ฌ์‹ค, data segment๋Š” file์— ์ •๋ณด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. run-time ์‹œ์ ์—์„œ ์ดˆ๊ธฐํ™” ๋˜๋Š” ๋ณ€์ˆ˜๋“ค(bss)์€ ๊ทธ ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๊ฐ€ ์•„๋‹Œ, ๋ณ€์ˆ˜์˜ ๋‚ด์šฉ์ด file์— ์ด๋ฏธ ์ ํ˜€์žˆ๋‹ค๋Š” ๋ง ์ž์ฒด๊ฐ€ ์–ด๋ถˆ์„ฑ์„ค์ด๋‹ค. compile ์‹œ์ ์— ์ดˆ๊ธฐํ™”๋œ ๋ณ€์ˆ˜๋ผ๊ณ  ํ•ด๋„, run time์— ๊ทธ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ถฉ๋ถ„ํžˆ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ data segment๋Š” ๋‹ค์‹œ file์— ์ ํžˆ๋ฉด ๊ณค๋ž€ํ•˜๋‹ค. ์ฆ‰, file์— swap out๋˜๋ฉด ์•ˆ๋œ๋‹ค. ๊ทธ '๋‚ด์šฉ'์ด file์— ์ด๋ฏธ ์—†์—ˆ๊ฑฐ๋‹ˆ์™€, ์žˆ์—ˆ๋‹ค ํ•˜๋”๋ผ๋„ ๊ทธ ๋‚ด์šฉ์„ ๋ฐ”๊ฟ”์„œ๋Š” ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (compile์ด ๋˜๋˜ ์‹œ์ ์— ์ด๋ฏธ ์ •ํ•ด์ง„ ๋‚ด์šฉ์ด๊ธฐ ๋•Œ๋ฌธ) ๊ทธ๋ž˜์„œ swap disk๋กœ swap out ํ•˜๊ธฐ ์œ„ํ•ด (swap out์ด file์„ ํ–ฅํ•œ๋‹ค๋Š” ๊ฑด write back์ด ์–ธ์ œ๋“  ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค), anonymous memory๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

๋‹ค๋งŒ, code segment๋Š” swap out์ด file์„ ํ–ฅํ•˜๋„๋ก ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด code segement ๋Š” read-only ๋ฉ”๋ชจ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค์˜ ๋™์ž‘์ค‘์— modify ๋  ์ผ์ด ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ pintos skeleton์—์„œ ๊ตฌํ˜„์˜ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด data segment์™€ ๋™์ผํ•˜๊ฒŒ anonymous memory๋กœ ์ง€์ •ํ–ˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

kernel code & data segment (by markchck)

"ํ”„๋กœ์„ธ์Šค์˜ code segment์™€ data segment์— ๋Œ€ํ•œ ๋ฌผ๋ฆฌ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๋Š” ๋ถ€๋ถ„์€ ์กด์žฌํ•˜๋Š”๋ฐ, kernel์˜ code์™€ data segment์— ๋Œ€ํ•œ ๋ฌผ๋ฆฌ๋ฉ”๋ชจ๋ฆฌ๋Š” ์–ธ์ œ ํ• ๋‹น๋ฐ›๋Š” ๊ฑฐ์ง€?"

์งˆ๋ฌธ์˜ ์‹œ์ž‘์€, ์ปค๋„์˜ code segment์™€ data segment์— ๋Œ€ํ•˜์—ฌ palloc_get_page ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด์„œ๋ถ€ํ„ฐ์˜€๋‹ค. ์˜๋ฌธ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, pintos๊ฐ€ ๋ฌผ๋ฆฌ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ์ง€๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

pintos๋Š” ๋ฌผ๋ฆฌ๋ฉ”๋ชจ๋ฆฌ๋ฅผ 2๋“ฑ๋ถ„ํ•˜์—ฌ ํ•œ์ชฝ์€ kernel์ด ์‚ฌ์šฉํ•  ์˜์—ญ, ํ•œ์ชฝ์€ user '๋“ค'์ด ์‚ฌ์šฉํ•  ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•œ๋‹ค. ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ๋ง์€ kernel ์ž์‹ ์ด ์ง€๋‹ˆ๊ณ  ์žˆ๋Š” ํŽ˜์ด์ง€ ํ• ๋‹น๊ธฐ๊ฐ€, ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ kernel pool๊ณผ user pool๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ test case๊ฐ€ ์ง€์ •ํ•˜๋Š” ๋ฌผ๋ฆฌ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์ธ 20MB๋ฅผ ๊ธฐ์ค€์œผ๋กœ, kernel pool๊ณผ user pool์— ๊ฐ€์šฉํ•œ page ๊ฐœ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Š” ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ „์ฒด ํฌ๊ธฐ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ€๋Šฅํ•œ ํŽ˜์ด์ง€์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•œ ๊ฒƒ ๋ฟ์ด๊ณ , ์‹ค์ œ๋กœ ์ด ๋‘ ๊ฐœ์˜ pool์ด ์ดˆ๊ธฐํ™” ๋˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ณ  ๋‚œ ๋’ค์˜ ํŽ˜์ด์ง€ ๊ฐœ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

user pool์˜ ํŽ˜์ด์ง€ ๊ฐœ์ˆ˜๋Š” ๊ทธ๋Œ€๋กœ์ง€๋งŒ, kernel pool์˜ ํŽ˜์ด์ง€ ๊ฐœ์ˆ˜๋Š” ๊ฐ์†Œํ–ˆ๋‹ค.
๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์šฐ๋ฆฌ๋Š” ์ด ๊ฐ์†Œ๋œ 463๊ฐœ์˜ ํŽ˜์ด์ง€ (463 = 2496 - 2033) ๋“ค์ด kernel code segment์™€ kernel data segment์— ํ• ๋‹น๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๊ณ , 1๋ฒˆ์งธ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํ‘œ์ค€ ์ถœ๋ ฅ์„ ํ†ตํ•ด ์‹ค์ œ ๊ฒฝ๊ณ„๊ฐ’๋“ค์„ ํ™•์ธํ•˜์—ฌ, 2๋ฒˆ์งธ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๋„์‹์„ ์™„์„ฑํ–ˆ๋‹ค.

(ํ™•๋Œ€ํ•ด์„œ ๋ณด๋ฉด ์ข‹๋‹ค ๐Ÿ˜…)
(mem_end๊ฐ€ ์ •ํ™•ํžˆ 20MB๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ(MB, MiB ์ฐจ์ด ๋“ฑ)์„ ์ƒ๊ฐํ•ด ๋ดค์ง€๋งŒ, ํ˜„์žฌ์˜ ๋…ผ์˜์—์„œ ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จํ•ด ์„ค๋ช…ํ•˜์ง€ ์•Š๋Š”๋‹ค.)
(์ƒˆ๋กœ ์•Œ๊ฒŒ๋œ ์ ์€, kernel์˜ code segment์™€ data segment์˜ memory ์ƒ์˜ layout์ด user process์˜ ๊ทธ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.)

kernel ๋ถ€ํŒ… ์‹œ user pool๊ณผ kernel pool์„ ๊ด€๋ฆฌํ•˜๋Š” ํŽ˜์ด์ง€ ํ• ๋‹น๊ธฐ๋ฅผ palloc_init () ํ˜ธ์ถœ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๋Š”๋ฐ, ์ด ์ดˆ๊ธฐํ™” ์ดํ›„์— ๊ฐ€์žฅ ์ฒ˜์Œ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋ฐ”๋กœ base_pml4 ๋ฅผ ์œ„ํ•œ ํ•œ ๊ฐœ์˜ ํŽ˜์ด์ง€๋‹ค (paging_init (mem_end) ํ˜ธ์ถœ ์•ˆ์—์„œ base_pml4 ๋ฅผ ์œ„ํ•œ ํŽ˜์ด์ง€ ํ•œ ๊ฐœ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด palloc_get_page(0)๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค). ๊ทธ๋ž˜์„œ kernel pool์˜ ์‹œ์ž‘์ง€์ ์€, ๊ฐ€์žฅ ์ฒ˜์Œ์œผ๋กœ ํ• ๋‹น๋œ ํŽ˜์ด์ง€์˜ ์‹œ์ž‘์ฃผ์†Œ, ์ฆ‰ base_pml4 ์˜ ์‹œ์ž‘์ฃผ์†Œ์ธ 0x8004230000 ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด, ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๊ฐ์†Œ๋œ 463๊ฐœ์˜ ํŽ˜์ด์ง€๊ฐ€ 0x8004000000 ~ 0x8004230000 ์‚ฌ์ด์— ํฌํ•จ๋˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ถ”๋ก ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ๋กœ ๊ณ„์‚ฐ์„ ํ•ด๋ณด๋ฉด, 0x230000 ์€ 560๊ฐœ ํŽ˜์ด์ง€ ํฌ๊ธฐ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ธ๋ฐ, ๋‚˜๋จธ์ง€ 97๊ฐœ(560 - 463) ํŽ˜์ด์ง€์— ํ•ด๋‹นํ•˜๋Š” ์˜์—ญ์€ ํ‘œ์ค€ ์ถœ๋ ฅ์—์„œ ๋ณด์ด๋Š” base_mem์˜ ๋๊ณผ ext_mem์˜ ์‹œ์ž‘ ์‚ฌ์ด์— ํ•ด๋‹นํ•˜๋Š” ์˜์—ญ์ด๋ผ๊ณ  ์ถ”๋ก ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค(0x100000 - 0x9fc00 == 385KB == 96.25 pages).

์›๋ž˜์˜ ์งˆ๋ฌธ์œผ๋กœ ๋Œ์•„์˜ค์ž๋ฉด, kernel์˜ code์™€ data segment์— ๋Œ€ํ•œ ๋ฌผ๋ฆฌ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์€, ํ•ด๋‹น ์˜์—ญ๋“ค์„ ํŽ˜์ด์ง€ ํ• ๋‹น๊ธฐ์˜ ์ดˆ๊ธฐํ™” ์‹œ์— ์ด๋ฏธ kernel pool ์—์„œ occupied๋œ ์ƒํƒœ๋ผ๊ณ  ์ง€์ •ํ•จ์œผ๋กœ์จ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

clock vs LRU (by jjaeny)

"ํฌ์ƒ๋  ํŽ˜์ด์ง€๋ฅผ ์ฐพ๋Š” page replacment policy๋กœ LRU๋ฅผ ์ ์šฉํ•˜๊ณ  ์‹ถ์€๋ฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜์ง€?"

๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ์— ๋” ์ด์ƒ ๊ฐ€์šฉํ•œ ํ”„๋ ˆ์ž„์ด ์—†์„๋•Œ ํฌ์ƒ์ž ํŽ˜์ด์ง€๋ฅผ ์„ ํƒํ•˜๋Š” page replacment policy ์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. โžก Optimal, LRU, Clock, Belady's anomaly

์šฐ๋ฆฌ๋Š” ์บ์‹ฑ์— ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” LRU (Least Recently Used)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ–ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด page replacment policy ์˜ ์„ฑ๋Šฅ์€, ์œ ์ €๊ฐ€ ์ ‘๊ทผํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์—†๋Š” ์ƒํ™ฉ์ด ์–ผ๋งˆ๋‚˜ ์ ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€, ์ฆ‰ page fault๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€ ๋กœ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๊ฒƒ์ด cache miss๋ฅผ ์ค„์ด๋Š” ๊ณผ์ •๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋Š๊ปด์กŒ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ("๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋””์Šคํฌ์— ๋Œ€ํ•œ ์บ์‹œ์ด๋‹ค.") ํ•˜์ง€๋งŒ ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ๋„์ €ํžˆ ๋– ์˜ค๋ฅด์ง€ ์•Š์•˜๋‹ค. ์™œ ๊ทธ๋žฌ์„๊นŒ?

์‚ฌ์‹ค ๊ด€๋ฆฌํ•ด์•ผํ•  list์— LRU๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š๋‹ค. ์–ด๋–ค ์›์†Œ๊ฐ€ 'Used'๋  ๋•Œ๋งˆ๋‹ค ๊ทธ ์›์†Œ๋ฅผ list์˜ head๋กœ ๋ณด๋‚ด์ค€๋‹ค๋ฉด, ํ•ญ์ƒ list์˜ tail์— ์กด์žฌํ•˜๋Š” ์›์†Œ๊ฐ€ Least Recently Used์ธ ์›์†Œ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ด 'Used'๋ผ๋Š” ๊ฐœ๋…์„, ์œ ์ €๊ฐ€ ํŽ˜์ด์ง€์— ํ•ด๋‹นํ•˜๋Š” ์ฃผ์†Œ์— '์ ‘๊ทผ' ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ€์น˜ํ•ด์„œ ์ƒ๊ฐํ•ด ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆํ•˜๋ ค๋‹ค๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•จ(๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค)์„ ๊นจ๋‹ฌ์•˜๋‹ค.

์™œ๋ƒํ•˜๋ฉด ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ ํ–ˆ์„ ๋•Œ ๊ทธ ์‚ฌ์‹ค์„ ์ปค๋„์ด โ€˜์•Œ์•„์•ผโ€™ ๊ทธ ํŽ˜์ด์ง€๋ฅผ ๊ด€๋ฆฌ ๋ฆฌ์ŠคํŠธ ์ƒ์—์„œ head๋กœ ์˜ฎ๊ธธ ์ˆ˜๊ฐ€ ์žˆ์„ ํ…๋ฐ, ์ปค๋„์ด ์œ ์ €๊ฐ€ ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ–ˆ์Œ์„ โ€˜์•„๋Š”โ€™ ๋ฐฉ๋ฒ•์€ ์ธํ„ฐ๋ŸฝํŠธ ๋ฐ–์— ์—†๋‹ค. ์ปค๋„์ด โ€˜์•ˆ๋‹ค๋Š”โ€™๊ฑด ์ปค๋„ ๋ชจ๋“œ๊ฐ€ '์ผœ์ ธ์•ผ'(๋น„์œ ํ•˜์ž๋ฉด ์˜์‹์ด ์žˆ์–ด์•ผ) ์•Œํ…๋ฐ ์œ ์ € ๋ชจ๋“œ์—์„œ ์ปค๋„ ๋ชจ๋“œ๊ฐ€ ์ผœ์ง€๋ ค๋ฉด(์ปค๋„์„ ๊นจ์šฐ๋ ค๋ฉด) ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ง์€ ๊ฒฐ๊ตญ LRU ๊ตฌํ˜„์„ ์œ„ํ•ด์„œ๋Š” ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๋Š” ๋ชจ๋“  ์ˆœ๊ฐ„์— ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•œ๋‹ค๋Š” ๋ง๊ณผ ๊ฐ™์•„์ง„๋‹ค. ๋ง๋„ ์•ˆ๋˜๋Š” ์–˜๊ธฐ.

๊ทธ๋ž˜์„œ ๋Œ€๋ถ€๋ถ„์˜ kernel ๊ตฌํ˜„์—์„œ page replacment policy ๋กœ clock ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•œ๋‹ค.
clock ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•˜๋“œ์›จ์–ด์˜ ๋„์›€์„ ๋ฐ›๋Š”๋‹ค. ์œ ์ €ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ํŽ˜์ด์ง€์˜ PTE์— ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ ์ ‘๊ทผ ๋˜์—ˆ๋‹ค๊ณ  ํ•˜๋Š” ๋น„ํŠธ(accessed)๋ฅผ ํ•˜๋“œ์›จ์–ด๊ฐ€ ์ผœ์ค€๋‹ค. ์ด ๊ณผ์ •์—์„œ ํŽ˜์ด์ง€ ํดํŠธ๋Š” ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์— evict๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์ด ๋˜์„œ์•ผ ์ปค๋„์ด ์ด ๋น„ํŠธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํฌ์ƒ์ž ํŽ˜์ด์ง€๋ฅผ ์ •ํ•œ๋‹ค.

๊ทธ๋ฆผ์—์„œ ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด, ํ”„๋ ˆ์ž„ ํฌ์ธํ„ฐ๊ฐ€ ์‹œ๊ณ„์˜ ์ดˆ์นจ์ฒ˜๋Ÿผ ํ…Œ์ด๋ธ”์„ ์ˆœํšŒํ•˜๋ฉด์„œ ํฌ์ƒ๋  ํŽ˜์ด์ง€๋ฅผ ์ฐพ๋Š”๋‹ค. ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ฐธ์กฐ ๋น„ํŠธ(accessed bit)๊ฐ€ 1์ด๋ผ๋ฉด (์ผœ์ ธ์žˆ๋‹ค๋ฉด) 0์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ„๋‹ค. ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜๋‹ค ์ฐธ์กฐ ๋น„ํŠธ๊ฐ€ 0์ธ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋‚œ๋‹ค๋ฉด ๊ทธ ํŽ˜์ด์ง€๋ฅผ ํฌ์ƒ์ž ํŽ˜์ด์ง€๋กœ ์‚ผ๊ณ  ๋‚จ์€ evict ๊ณผ์ •์„ ์ด์–ด์„œ ์ง„ํ–‰ํ•œ๋‹ค.

๊ทธ ์ดํ›„๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ๊ณ„์† ์‹คํ–‰๋˜๋‹ค๊ฐ€ ๋‹ค์‹œ evict๊ฐ€ ํ•„์š”ํ•œ ์ˆœ๊ฐ„์ด ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ•˜์ž. ํ•˜๋“œ์›จ์–ด๋Š” ์ด์ „ evict๊ฐ€ ์ฒ˜๋ฆฌ๋œ ์ดํ›„๋ถ€ํ„ฐ, ๋‹ค์‹œ ๋งค ์ ‘๊ทผ๋งˆ๋‹ค ํ•ด๋‹น PTE์˜ ๋น„ํŠธ๋ฅผ ์ผœ์ฃผ๊ณ  ์žˆ์—ˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋ฒˆ์—๋„ kernel์€ ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์ด๋•Œ ์ฐธ์กฐ ๋น„ํŠธ๊ฐ€ 0์ธ ํŽ˜์ด์ง€๋Š” ์ด์ „ evict ๋ฐœ์ƒ ์ˆœ๊ฐ„๊ณผ ํ˜„์žฌ์˜ evict ๋ฐœ์ƒ ์ˆœ๊ฐ„ ์‚ฌ์ด์— ์ „ํ˜€ ์ ‘๊ทผ๋˜์ง€ ์•Š์•˜์Œ์„ ์ถ”๋ก ํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ๊ทธ ํŽ˜์ด์ง€๊ฐ€ recently ํ•˜๊ฒŒ used๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

clock ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ LRU๋ฅผ approximate ํ•  ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ํŽ˜์ด์ง€๊ฐ€ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์•Œ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด, list๋กœ LRU๊ฐ€ ๊ตฌํ˜„๋œ ์ƒํ™ฉ์ด๋ผ๋„, list์˜ head์— ์–ด๋–ค ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋Š”์ง€ ๋ณด๋‹ค๋Š” tail์— ์–ด๋–ค ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋Š”์ง€์—๋งŒ ๊ด€์‹ฌ์„ ๋‘๋ฉด ๋œ๋‹ค. ์ฆ‰, ์–ด๋–ค ํŽ˜์ด์ง€๊ฐ€ ๊ฐ€์žฅ โ€˜์ฝœ๋“œโ€™ํ•œ ํŽ˜์ด์ง€ ์ธ์ง€๋งŒ ์•Œ๋ฉด๋œ๋‹ค. ๊ทธ๋ž˜์„œ ํด๋ฝ์„ ์‚ฌ์šฉํ•˜๋ฉด LRU์— ๊ทผ์ ‘ํ•œ ์ˆ˜ํ–‰์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

CR0 register (by ubs4939)

"writable ํ•˜์ง€ ์•Š์€ ํŽ˜์ด์ง€์— ๊ณ„์† ์“ฐ๊ธฐ๋ฅผ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์—ฌํƒœ๊ป ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์–ด.
์ด๊ฒŒ ๋ญ์ง€...???"

lazy load๋ฅผ ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š” do_lazy_load ํ•จ์ˆ˜์ด๋‹ค. ์ค‘๊ฐ„ ๋ผ์ธ ์ •๋„์˜ file_read_at์„ ๋ณด๋ฉด user buffer๋กœ page์˜ va๋ฅผ ์ฃผ๊ณ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์ด page๊ฐ€ read-only๋ผ๋ฉด? page fault in kernel context ๊ฐ€ ๋ฐœ์ƒํ•ด ์ปค๋„์ด ์ฃฝ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ์‚ฌ์‹ค ์ด๋Ÿฌํ•œ ์˜์‹ฌ์—†์ด ๊ณ„์† ์ด ์ฝ”๋“œ๋กœ test๋ฅผ ๋Œ๋ฆฌ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋‹ค๋Š” ๊ฑธ ๋’ค๋Šฆ๊ฒŒ์•ผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ์ฃผ์†Œ๋Š” ๋‘๊ฐ€์ง€ ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋‚˜๋Š” ์œ ์ €์˜ virtual address (page->va) ์— ํ•ด๋‹นํ•˜๋Š” PTE, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ปค๋„์˜ virtual address (frame->kva) ์— ํ•ด๋‹นํ•˜๋Š” PTE. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— do_lazy_load ์‹คํ–‰๋˜๊ธฐ ์ „, ์œ ์ € ํŽ˜์ด์ง€์˜ PTE๊ฐ€ pml4_set_page์„ ํ†ตํ•ด not writable ๋กœ ์ง€์ •๋˜๋”๋ผ๋„, ์ปค๋„ kva๋ฅผ ํ†ตํ•ด writeํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปค๋„ PTE๋Š” (์ปค๋„ text ์˜์—ญ ์ œ์™ธ) ๋ชจ๋‘ writable ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ๊ฒฝ์šฐ์—๋Š” file_read_at ์˜ user buffer ์ฃผ์†Œ๋กœ frame->kva ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋ฌธ์ œ ์—†์ด lazy load๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ page->va ๋ฅผ ์ „๋‹ฌํ–ˆ์„ ๋•Œ๋„ ์™œ ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋˜ ๊ฒƒ์ผ๊นŒ?

skeleton ์ฝ”๋“œ๋ฅผ ํ•œ์ฐธ๋™์•ˆ ๋œฏ์–ด๋ณด๊ณ , stack overflow๋„ ๋’ค์ ธ๋ณด๊ณ , ์กฐ๊ต๋‹˜๊ป˜ ์งˆ๋ฌธ๋„ ํ•ด๋ณธ ๊ฒฐ๊ณผ, ์ด๋Š” pintos ๋ถ€ํŒ… ์‹œ์˜ ๊ธฐ๋ณธ ์„ค์ • ๋•๋ถ„์ด์—ˆ์Œ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

x86-64 ์•„ํ‚คํ…์ณ์—๋Š” Control Register๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ๊ณ„์ธต์—์„œ ์ตœ์ƒ์œ„ ํ…Œ์ด๋ธ”์ธ pml4์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•ด๋‘ฌ์•ผ ํ•˜๋Š”(๊ทธ๋ž˜์•ผ mmu๊ฐ€ ์ด ์ฃผ์†Œ๋ฅผ ๋ณด๊ณ  walking ํ•  ์ˆ˜ ์žˆ๋‹ค) CR3 (PDBR : Page Directory Base Register), page fault ๋ฐœ์ƒ ์‹œ cpu๊ฐ€ fault address ๋ฅผ ์ ์–ด๋‘๋Š” CR2 ๋ชจ๋‘ ์ด Control Register ์ด๋‹ค.

์ง€๊ธˆ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ ๋ ˆ์ง€์Šคํ„ฐ๋Š” CR0. ํŠนํžˆ Write Protection (WP) bit ์˜€๋‹ค. WP bit๊ฐ€ ๊บผ์ ธ ์žˆ๋‹ค๋ฉด, ring 0 (kernel mode) ์ฝ”๋“œ๋Š” ์“ฐ๊ธฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ œํ•œ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  pintos์˜ ๋ถ€ํŒ… ๊ณผ์ •์—์„œ CR0์˜ WP bit๋Š” ์ผœ์ง€์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ kernel code๋Š” write ์ ‘๊ทผ์ œํ•œ์„ ๋ฌด์‹œํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์ด๋Ÿฌํ•œ ์„ค์ •์ด ํ•„์š”ํ• ๊นŒ? kernel์€ ์œ ์ € ํ”„๋กœ์„ธ์Šค๋“ค์˜ supervisor ์ด๋‹ค. user์—๊ฒŒ read-only์ธ page๋„ supervisor๋Š” ํ•„์š”ํ•˜๋‹ค๋ฉด ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค (e.g. lazy loading์˜ .text ์˜์—ญ). ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” WP bit๊ฐ€ set๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

ํ•˜์ง€๋งŒ ์ด WP bit๊ฐ€ set ๋˜์–ด์žˆ์œผ๋ฉด ํŽธ๋ฆฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค : Copy on write.

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹จ ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ ๊ณต๊ฐ„์„ ๋ฐ”๋ผ๋ณด๋ฉด์„œ ๊ทธ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์šฉ์„ ๊ณต์œ ํ•˜๋‹ค๊ฐ€ (๊ทธ ๋ฉ”๋ชจ๋ฆฌ๋Š” read-only๋กœ ์„ค์ •ํ•ด๋‘”๋‹ค), ์–ด๋Š ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ด๋‹น ์˜์—ญ์— ์“ฐ๊ธฐ(write)๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๊ทธ์ œ์„œ์•ผ(on) ์‹œ๋„ํ•œ ํ”„๋กœ์„ธ์Šค ๋งŒ์„ ์œ„ํ•œ ๋ฌผ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•˜์—ฌ ์›๋ž˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•ด์ค€๋‹ค (copy). ์ด ๋•Œ ์ปค๋„์€ write์— ๋Œ€ํ•œ ์‹œ๋„๋ฅผ page fault๋ฅผ ํ†ตํ•ด ์ธ์ง€ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, WP bit๊ฐ€ set ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, (์œ ์ €์˜ write ์‹œ๋„๋Š” ์œ ์ €๊ฐ€ ์ผ์œผํ‚ค๋Š” page fault๋ฅผ ํ†ตํ•ด ์ถฉ๋ถ„ํžˆ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ) ์ปค๋„ ์ž๊ธฐ์ž์‹ ์ด write ์‹œ๋„๋ฅผ ํ•˜๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•ด์„œ๋Š” ์ธ์ง€ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค (์‹œ์Šคํ…œ ์ฝœ๋กœ ์ธํ•ด ์œ ์ €์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋‹ค๊ฐ€ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— write๋ฅผ ์‹œ๋„ํ•˜๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ปค๋„์€ ์ž๊ธฐ ์ž์‹ ์ด ์ผ์œผํ‚ค๋Š” page fault๋„ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค). ๊ทธ๋ž˜์„œ WP bit๋ฅผ set ํ•จ์œผ๋กœ์จ ์ปค๋„์€ ์ž๊ธฐ ์ž์‹ ์˜ write ์‹œ๋„์— ๋Œ€ํ•ด์„œ๋„ ์ถฉ๋ถ„ํžˆ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋ฆฌ๋ˆ…์Šค์—์„œ๋„ ์ด ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด WP bit์„ setํ•ด ์ฃผ๊ณ  ์žˆ๋‹ค.

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ํ•ญ์ƒ ์ด๋ก ์œผ๋กœ๋งŒ ๊ณต๋ถ€ํ•ด ์ž˜ ์™€๋‹ฟ์ง€ ์•Š์•˜๋˜ ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹ค์ œ ๋™์ž‘๋ฐฉ์‹์„ ์•„์ฃผ ๋ช…์พŒํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. pintos์˜ ๊ตฌํ˜„์ด generalํ•˜๋‹ค๊ณ  ๋ณด๊ธฐ์—” ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง ๊ณต๋ถ€ํ•ด์•ผ ํ•  ๊ฒƒ์ด ๋งŽ์ด ๋‚จ์•˜์ง€๋งŒ, ์–ด์จŒ๋“  ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ณ๋ณด๋ฉด์„œ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ์ค‘์š”ํ•˜๊ตฌ๋‚˜, ์‚ฌ๋žŒ๋“ค์ด ๊ดœํžˆ ๊ทธ๋ ‡๊ฒŒ ๋งํ–ˆ๋˜ ๊ฒƒ์ด ์•„๋‹ˆ๊ตฌ๋‚˜ ํ•˜๊ณ  ๋Š๋ผ๊ฒŒ ๋œ 2์ฃผ์˜€๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

profile
I think I think too much.
post-custom-banner

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

comment-user-thumbnail
2022๋…„ 12์›” 14์ผ

์ž˜์ฝ์—ˆ์Šต๋‹ˆ๋‹ค~

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2022๋…„ 12์›” 16์ผ

๋ง›์žˆ๋‹ค...

1๊ฐœ์˜ ๋‹ต๊ธ€