FIFO置换算法

所谓FIFO(First in, First out)页面置换算法,相当简单,就是把所有页面排在一个队列里,每次换入页面的时候,把队列里最靠前(最早被换入)的页面置换出去。

换出页面的时机相对复杂一些,针对不同的策略有不同的时机。ucore 目前大致有两种策略,即积极换出策略和消极换出策略。积极换出策略是指操作系统周期性地(或在系统不忙的时候)主动把某些认为“不常用”的页换出到硬盘上,从而确保系统中总有一定数量的空闲页存在,这样当需要空闲页时,基本上能够及时满足需求;消极换出策略是指,只是当试图得到空闲页时,发现当前没有空闲的物理页可供分配,这时才开始查找“不常用”页面,并把一个或多个这样的页换出到硬盘上。

目前的框架支持第二种情况,在alloc_pages()里面,没有空闲的物理页时,尝试换出页面到硬盘上。

// kern/mm/pmm.c
// alloc_pages - call pmm->alloc_pages to allocate a continuous n*PAGESIZE memory
struct Page *alloc_pages(size_t n) {
    struct Page *page = NULL;
    bool intr_flag;

    while (1) {
        local_intr_save(intr_flag);
        { page = pmm_manager->alloc_pages(n); }
        local_intr_restore(intr_flag);
        //如果有足够的物理页面,就不必换出其他页面
        //如果n>1, 说明希望分配多个连续的页面,但是我们换出页面的时候并不能换出连续的页面
         //swap_init_ok标志是否成功初始化了
        if (page != NULL || n > 1 || swap_init_ok == 0) break;

        extern struct mm_struct *check_mm_struct;
        swap_out(check_mm_struct, n, 0);//调用页面置换的”换出页面“接口。这里必有n=1
    }
    return page;
}

类似pmm_manager, 我们定义swap_manager, 组合页面置换需要的一些函数接口。

我们来看swap_in(), swap_out()如何换入/换出一个页面.注意我们对物理页面的 Page结构体做了一些改动。

kern/mm/swap.c里其他的接口基本都是简单调用swap_manager的具体实现。值得一提的是swap_init()初始化里做的工作。

kern/mm/swap_fifo.h完成了FIFO置换算法最终的具体实现。我们所做的就是维护了一个队列(用链表实现)。

我们通过_fifo_check_swap(), check_swap(), check_vma_struct(), check_pgfault()等接口对页面置换机制进行了简单的测试。具体测试的细节这里地方太小了,写不下。

目前的参考代码可以在这里找到。

最后更新于

这有帮助吗?