๐Ÿ“€ KAIST:PINTOS | Implementation | Frame Table

์ด์ˆœ๊ฐ„ยท2025๋…„ 5์›” 30์ผ

KAIST:PINTOS

๋ชฉ๋ก ๋ณด๊ธฐ
23/23

Frame Table์˜ ๊ฐœ๋…

Frame Table์€ ์šด์˜์ฒด์ œ์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€(ํ”„๋ ˆ์ž„)๋ฅผ ์ „์—ญ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์šด์˜์ฒด์ œ์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์ œ๊ณตํ•˜๊ณ , ์ด ๊ฐ€์ƒ ์ฃผ์†Œ๋Š” ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์˜ ํ”„๋ ˆ์ž„์œผ๋กœ ๋งคํ•‘๋œ๋‹ค. ์ด๋•Œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹ค์ œ ์‚ฌ์šฉ ํ˜„ํ™ฉ์„ ํŒŒ์•…ํ•˜๊ณ , ์–ด๋–ค ํ”„๋ ˆ์ž„์ด ๋ˆ„๊ตฌ(์–ด๋–ค ํ”„๋กœ์„ธ์Šค)์˜ ๊ฐ€์ƒ ํŽ˜์ด์ง€๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด Frame Table์ด ํ•„์š”ํ•˜๋‹ค.

ํ”„๋ ˆ์ž„์€ ํ•œ ๋ฒˆ ํ• ๋‹น๋˜๋ฉด ์–ด๋–ค ์œ ์ € ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š”์ง€ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ํ”„๋ ˆ์ž„์ด ๋ถ€์กฑํ•ด์ง€๋ฉด ๊ต์ฒด(eviction) ์ •์ฑ…์„ ํ†ตํ•ด ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์„ swap-outํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ํ”„๋ ˆ์ž„์„ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค. Frame Table์€ ์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„ ๊ด€๋ฆฌ์˜ ์ค‘์‹ฌ ์—ญํ• ์„ ๋งก๋Š”๋‹ค.


Frame Table์ด ํ•„์š”ํ•œ ์ด์œ 

๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ์š”๊ตฌํ•  ๋•Œ๋งˆ๋‹ค ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋นˆ ํ”„๋ ˆ์ž„์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์œ ํ•œํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•ญ์ƒ ๋นˆ ํ”„๋ ˆ์ž„์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์ด ๋ถ€์กฑํ•˜๋ฉด ๊ต์ฒด ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋‚˜ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ํ”„๋ ˆ์ž„์„ ๋น„์›Œ์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Frame Table์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋˜ํ•œ, ์Šค๋ ˆ๋“œ๋‚˜ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Frame Table์€ ๋™์‹œ ์ ‘๊ทผ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฝ(lock)์œผ๋กœ ๋ณดํ˜ธํ•ด์•ผ ํ•œ๋‹ค.


Frame Table์˜ ์ฃผ์š” ๋ฐ์ดํ„ฐ

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 ์ •์ฑ…๊ณผ ์—ฐ๊ณ„

ํ”„๋ ˆ์ž„์ด ๋ถ€์กฑํ•  ๋•Œ ์–ด๋–ค ํ”„๋ ˆ์ž„์„ ๋‚ด๋ณด๋‚ผ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด Eviction ์ •์ฑ…์ด๋‹ค. ๋ณดํ†ต LRU Clock ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

Eviction์˜ ํ•ต์‹ฌ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Frame Table์„ ์ˆœํšŒํ•˜์—ฌ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์„ ์ฐพ๋Š”๋‹ค.
  2. ์„ ํƒ๋œ ํ”„๋ ˆ์ž„์˜ ๋ฐ์ดํ„ฐ๋ฅผ swap-outํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ์— ๋‹ค์‹œ ๊ธฐ๋กํ•œ๋‹ค.
  3. ํ•ด๋‹น ํ”„๋ ˆ์ž„์˜ ์—ฐ๊ฒฐ๋œ SPT๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  4. Eviction์œผ๋กœ ํ™•๋ณด๋œ ํ”„๋ ˆ์ž„์„ ๋‹ค์‹œ ํ• ๋‹นํ•œ๋‹ค.

์ฃผ์˜ํ•  ์ 

  • Frame Table์€ ์ „์—ญ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋ฏ€๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋‚˜ ํ”„๋กœ์„ธ์Šค์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ๋ฝ์„ ์‚ฌ์šฉํ•ด ๋™์‹œ ์ ‘๊ทผ์„ ๋ง‰์•„์•ผ ํ•œ๋‹ค.
  • palloc_get_page()๋‚˜ palloc_free_page()๋Š” PintOS์—์„œ ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ ์ •ํ™•ํžˆ ์–ธ์ œ ํ˜ธ์ถœ๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
  • SPT์™€ Frame Table์€ ์œ ๊ธฐ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค. SPT์˜ ํŽ˜์ด์ง€๊ฐ€ ํ”„๋ ˆ์ž„์„ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด Frame Table์˜ ์—”ํŠธ๋ฆฌ์™€ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•œ๋‹ค.
profile
์„œํˆด์ง€์–ธ์ • ๋Š˜ ํ–‰๋™์ด ๋จผ์ €์ด๊ธฐ๋ฅผ

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