Linux内存管理 -- 白话Linux page cache / swap cache/页框回收

文章目录

  • Linux内存管理 -- 白话页框回收
    • 什么是Page Cache?
    • 什么是Swap Cache?
    • 什么是buffer Cache?
    • 图解页框回收

Linux内存管理 – 白话页框回收

经过前面几篇博客翻译和阅读Understaning Linux Virtutal Memory Manger,对于Linux页框回收有了一些基本的理解。现在自己再来对照Linux kernel2.6.9源码来做一些总结。

什么是Page Cache?

在Linux中所谓的page cache就是指struct address_space。磁盘中一个文件或者其他虚拟文件(shmem)所对应的page每次都是经过同一个struct address_space来进行管理,便于此类型的page在多进程见进行共享,以及阻止一些不必要的磁盘IO。
如下图中,两个进程打开同一个文件file A,以及读取文件内容:
Linux内存管理 -- 白话Linux page cache / swap cache/页框回收_第1张图片
从上图中可以看出,page cache的作用主要是将磁盘中文件缓存到内存,并集中管理,便于回收利用。

什么是Swap Cache?

系统中常常会有一些进程在初始化时要了很多memory(主要是通过malloc获取的匿名page),初始化完成之后,这部分memory该进程不会经常用到,也没有释放。这就造成了内存的浪费。Linux就想了个办法要把这些memory中的数据置换到磁盘中,然后将这个memory标记为可回收,然后Linux中页框回收机制就会将这些page回收然后将这些page让给有需要的进程来用。
swap cache主要是要解决两个层面的问题:
<1>哪些page可以加入到swap cache中?swap cache中page如何管理?
<2>swap cache中被交换到磁盘中page,如何知道放在磁盘哪个位置,再次被找回来 ?
第一个问题有一个特殊的address_space,swapper_space来管理,具体如何回收由下一小节说明。
第二个问题通过struct swap_info_struct来管理,其中最终要的是将原来这个page的对应的PTE替换成type + offset的形式。
Linux内存管理 -- 白话Linux page cache / swap cache/页框回收_第2张图片

什么是buffer Cache?

在page cache出现之前,文件的缓存或者块设备的数据缓存叫做buffer cache。现在都叫page cache。

图解页框回收

  • 在Linux的每个Zone中有两个list:active_list和inactive_list,这两个list包含了该Zone中所有已经分配的page。其中active_list中表示正在使用的page,而inactive_list中是很少使用待回收的page。
  • 在下列两种case下会触发内存回收机制:从active_list的底部循环将active_list中符合条件的page添加待inactive_list,然后再从inactive_list中选择合适的page释放内存。
    • 每当alloc page时,如果发现memory不够了,调用try_to_free_pages()来释放内存。
    • 通过守护进程kswapd来check zone的memory water mark,发现内存到达低水位,触发内存回收机制释放内存。
      Linux内存管理 -- 白话Linux page cache / swap cache/页框回收_第3张图片

你可能感兴趣的:(Linux,kernel,linux,内存管理,内存优化,内核,缓存)