Linux内存管理 -- 白话Linux page cache / swap 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,以及读取文件内容:
address_space
从上图中可以看出,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的形式。
swap

什么是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,发现内存到达低水位,触发内存回收机制释放内存。
      de
  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值