linux kernel swap

 

shrink_page_list(struct list_head *page_list, struct pglist_data *pgdat, struct scan_control *sc, enum ttu_flags ttu_flags, struct reclaim_stat *stat, bool force_reclaim)

初步被选出来的系统认为满足条件的页面放在 page_list 这个链表中,至于如何选择满足条件的页面,是由内存回收算法LRU决定,这是内存管理方面的知识,这里不作详细地描述。在这个函数中会对 page_list 链表中所有的页面逐一处理,若是匿名的并且没有被 swap cache 缓存的页面,通过 add_to_swap 函数通知 swap core 和 swap cache 把该页面的数据交换出内存,随后在 try_to_unmap 函数中修改该 page 对应的 pte,使其指向 swap entry 的 pte。因此 add_to_swap 函数则是 swap core 和 swap cache 与内存回收之间的桥梁。

 

Swap Out - 从内存到磁盘

内核在回收anonymous pages前,会把它们的内容复制到一个swap area的某个slot中保存起来,这个过程叫做swap out,对应的执行函数是add_to_swap()。

linux kernel swap

首先需要调用get_swap_page()函数从swap area中分配空余的slot,然后增加swap cache(交换缓存)对准备swap out的页面的指向,并标记这个页面的状态为"dirty"。由于swap cache的作用主要体现在swap in的过程中,因此将放在下文详细介绍。

linux kernel swap

等到调用swap_writepage(),才会执行真正的I/O操作,将页面的内容写入外部的swap area,然后清除swap cache对页面的指向,释放页面所占的内存:

int swap_writepage(struct page *page, struct writeback_control *wbc)
{
    int ret = 0;

    if (try_to_free_swap(page)) {
        unlock_page(page);
        goto out;
    }
    if (frontswap_store(page) == 0) {
        set_page_writeback(page);
        unlock_page(page);
        end_page_writeback(page);
        goto out;
    }
    ret = __swap_writepage(page, wbc, end_swap_bio_write);
out:
    return ret;
}

 

 

 

 

reference:

https://blog.csdn.net/qkhhyga2016/article/details/88722458

https://zhuanlan.zhihu.com/p/70964551

 

linux kernel swap

上一篇:linux系统中nmcli命令、查看、添加、删除、编辑网络会话


下一篇:VSCode Ubuntu下调试失败 无法打开 libc-start.c raise.c等