Frame Table์ ์ด์์ฒด์ ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์คํ ์์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง(ํ๋ ์)๋ฅผ ์ ์ญ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ด์์ฒด์ ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ํ๋ก์ธ์ค๋ง๋ค ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ์ ๊ณตํ๊ณ , ์ด ๊ฐ์ ์ฃผ์๋ ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ํ๋ ์์ผ๋ก ๋งคํ๋๋ค. ์ด๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ค์ ์ฌ์ฉ ํํฉ์ ํ์ ํ๊ณ , ์ด๋ค ํ๋ ์์ด ๋๊ตฌ(์ด๋ค ํ๋ก์ธ์ค)์ ๊ฐ์ ํ์ด์ง๋ฅผ ๋ด๊ณ ์๋์ง๋ฅผ ์ถ์ ํ๊ธฐ ์ํด Frame Table์ด ํ์ํ๋ค.
ํ๋ ์์ ํ ๋ฒ ํ ๋น๋๋ฉด ์ด๋ค ์ ์ ํ์ด์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋์ง ์ฐ๊ฒฐ๋์ด์ผ ํ๋ฉฐ, ํ๋ ์์ด ๋ถ์กฑํด์ง๋ฉด ๊ต์ฒด(eviction) ์ ์ฑ ์ ํตํด ๋ค๋ฅธ ํ๋ ์์ swap-outํ๊ฑฐ๋ ์๋ก์ด ํ๋ ์์ ํ ๋นํด์ผ ํ๋ค. Frame Table์ ์ด๋ฌํ ํ๋ ์ ๊ด๋ฆฌ์ ์ค์ฌ ์ญํ ์ ๋งก๋๋ค.
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ ์๋ก์ด ํ์ด์ง๋ฅผ ์๊ตฌํ ๋๋ง๋ค ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์์ ๋น ํ๋ ์์ ์ฐพ์์ผ ํ๋ค. ํ์ง๋ง ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ ์ ํํ๊ธฐ ๋๋ฌธ์, ํญ์ ๋น ํ๋ ์์ด ์๋ ๊ฒ์ ์๋๋ค. ํ๋ ์์ด ๋ถ์กฑํ๋ฉด ๊ต์ฒด ์ ์ฑ ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ํ์ด์ง์ ํ๋ ์์ ๋น์์ผ ํ๋ค. ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด Frame Table์ด ์์ด์ผ ํ๋ค.
๋ํ, ์ค๋ ๋๋ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์, Frame Table์ ๋์ ์ ๊ทผ์ ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ๋ฝ(lock)์ผ๋ก ๋ณดํธํด์ผ ํ๋ค.
Frame Table์ ๊ฐ ์ํธ๋ฆฌ๋ ํ๋์ ํ๋ ์์ ๋ํ๋ด๋ฉฐ ๋ณดํต ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ด๋๋ค.
๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ปค๋ ๊ฐ์์ฃผ์
void *kva
palloc_get_page()๋ก ์ป์ ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ปค๋ ๊ฐ์์ฃผ์์ด๋ค.
์ฐ๊ฒฐ๋ ์ ์ ํ์ด์ง
struct page *page
์ด๋ค ์ ์ ํ์ด์ง๊ฐ ์ด ํ๋ ์์ ์ฌ์ฉ ์ค์ธ์ง ๋ํ๋ธ๋ค. ์ด๋ Supplemental Page Table(SPT)์ ์ํธ๋ฆฌ์ ์ฐ๊ฒฐ๋๋ค.
pinned ์ฌ๋ถ
Eviction ๊ณผ์ ์์ ์ ๊น ๋ณดํธํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ธ๋ค. ์๋ฅผ ๋ค์ด, ํ์ผ ์ฝ๊ธฐ๋ ์ฐ๊ธฐ ์ค์๋ ํ์ด์ง๋ฅผ Eviction์ผ๋ก ๋ด๋ณด๋ผ ์ ์๊ธฐ ๋๋ฌธ์ pinned ์ํ๋ก ๋๋ค.
๊ธฐํ ์ ๋ณด
Eviction ์๊ณ ๋ฆฌ์ฆ(์: LRU Clock)์ ๊ตฌํํ ๋๋ ์ ๊ทผ ๋นํธ๋ ๋ค๋ฅธ ์ํ ๋นํธ๋ ์ถ๊ฐํ ์ ์๋ค.
Frame Table์ ๋ณดํต ์ ์ญ ๋ฆฌ์คํธ ํํ๋ก ์ ์ธํ๋ค.
vm.c ๋๋ vm.h์ ์๋์ฒ๋ผ ์ ์ธํ๋ค.
struct frame {
void *kva; // ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ปค๋ ๊ฐ์์ฃผ์
struct page *page; // ์ฐ๊ฒฐ๋ ์ ์ ํ์ด์ง
struct list_elem elem; // ๋ฆฌ์คํธ์์์ ์์น
bool pinned; // Eviction ์ค ๋ณดํธ ์ฌ๋ถ
};
struct list frame_table;
struct lock frame_table_lock; // ๋ฉํฐ์ค๋ ๋ ๋ณดํธ์ฉ ๋ฝ
์ ์ ํ์ด์ง๊ฐ ์๋ก์ด ํ๋ ์์ ์์ฒญํ ๋ ํธ์ถ๋๋ ํจ์์ด๋ค.
struct frame *frame_allocate(enum palloc_flags flags, struct page *page) {
void *kva = palloc_get_page(flags);
if (kva == NULL) {
// ํ๋ ์์ด ๋ถ์กฑํ๋ฉด Eviction์ ์ํํด ํ๋ ์ ํ๋ณด
kva = evict_frame();
if (kva == NULL) {
PANIC("Cannot evict any frame!");
}
}
struct frame *f = malloc(sizeof(struct frame));
f->kva = kva;
f->page = page;
f->pinned = false;
lock_acquire(&frame_table_lock);
list_push_back(&frame_table, &f->elem);
lock_release(&frame_table_lock);
return f;
}
์ด ํจ์์ ์ฃผ์ ์ญํ ์ ์๋ก์ด ํ๋ ์์ ํ๋ณดํ๊ณ Frame Table์ ๋ฑ๋กํ๋ ๊ฒ์ด๋ค. ํ๋ ์์ด ๋ถ์กฑํ ๋๋ Eviction ์ ์ฑ ์ ์ฌ์ฉํด ํ๋ณดํ๋ค.
ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๊ฑฐ๋, ํ๋ ์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ ๋ ํธ์ถ๋๋ค.
void frame_free(struct frame *f) {
lock_acquire(&frame_table_lock);
list_remove(&f->elem);
lock_release(&frame_table_lock);
palloc_free_page(f->kva);
free(f);
}
ํด๋น ํ๋ ์์ Frame Table์์ ์ ๊ฑฐํ๊ณ , ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ๋ค.
ํ๋ ์์ด ๋ถ์กฑํ ๋ ์ด๋ค ํ๋ ์์ ๋ด๋ณด๋ผ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ด Eviction ์ ์ฑ ์ด๋ค. ๋ณดํต LRU Clock ์๊ณ ๋ฆฌ์ฆ์ด ์์ฃผ ์ฌ์ฉ๋๋ค.
Eviction์ ํต์ฌ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
palloc_get_page()๋ palloc_free_page()๋ PintOS์์ ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์์ด๋ฏ๋ก ์ ํํ ์ธ์ ํธ์ถ๋๋์ง ํ์ธํด์ผ ํ๋ค.