Linux内核学习笔记(八)Page Cache与Page回写

Page cache是经过将磁盘中的数据缓存到内存中,从而减小磁盘I/O操做,从而提升性能。此外,还要确保在page cache中的数据更改时可以被同步到磁盘上,后者被称为page回写(page writeback)。一个inode对应一个page cache对象,一个page cache对象包含多个物理page。java

对磁盘的数据进行缓存从而提升性能主要是基于两个因素:第一,磁盘访问的速度比内存慢好几个数量级(毫秒和纳秒的差距)。第二是被访问过的数据,有很大几率会被再次访问。node

Page Cache
Page cache由内存中的物理page组成,其内容对应磁盘上的block。page cache的大小是动态变化的,能够扩大,也能够在内存不足时缩小。cache缓存的存储设备被称为后备存储(backing store),注意咱们在block I/O一文中提到的:一个page一般包含多个block,这些block不必定是连续的。算法

读Cache
当内核发起一个读请求时(例如进程发起read()请求),首先会检查请求的数据是否缓存到了page cache中,若是有,那么直接从内存中读取,不须要访问磁盘,这被称为cache命中(cache hit)。若是cache中没有请求的数据,即cache未命中(cache miss),就必须从磁盘中读取数据。而后内核将读取的数据缓存到cache中,这样后续的读请求就能够命中cache了。page能够只缓存一个文件部分的内容,不须要把整个文件都缓存进来。缓存

写Cache
当内核发起一个写请求时(例如进程发起write()请求),一样是直接往cache中写入,后备存储中的内容不会直接更新。内核会将被写入的page标记为dirty,并将其加入dirty list中。内核会周期性地将dirty list中的page写回到磁盘上,从而使磁盘上的数据和内存中缓存的数据一致。性能

Cache回收
Page cache的另外一个重要工做是释放page,从而释放内存空间。cache回收的任务是选择合适的page释放,而且若是page是dirty的,须要将page写回到磁盘中再释放。理想的作法是释放距离下次访问时间最久的page,可是很明显,这是不现实的。下面先介绍LRU算法,而后介绍基于LRU改进的Two-List策略,后者是Linux使用的策略。.net

LRU算法
LRU(least rencently used)算法是选择最近一次访问时间最靠前的page,即干掉最近没被光顾过的page。原始LRU算法存在的问题是,有些文件只会被访问一次,可是按照LRU的算法,即便这些文件之后不再会被访问了,可是若是它们是刚刚被访问的,就不会被选中。对象

Two-List策略
Two-List策略维护了两个list,active list 和 inactive list。在active list上的page被认为是hot的,不能释放。只有inactive list上的page能够被释放的。首次缓存的数据的page会被加入到inactive list中,已经在inactive list中的page若是再次被访问,就会移入active list中。两个链表都使用了伪LRU算法维护,新的page从尾部加入,移除时从头部移除,就像队列同样。若是active list中page的数量远大于inactive list,那么active list头部的页面会被移入inactive list中,从而位置两个表的平衡。
————————————————
版权声明:本文为CSDN博主「胡LiuJia」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处连接及本声明。
原文连接:https://blog.csdn.net/damonti...blog

相关文章
相关标签/搜索