本文介绍的 PageCache(页高速缓冲存储器) 是 Linux 在读取文件数据中会把文件先拷贝到 内核缓冲区,其实是磁盘高速缓存。可以看看博文《零拷贝-并不是没有拷贝》,文中图文有描述这个过程。
CPU 读写磁盘相比读写内存的速度实在太慢了,所以如果把读磁盘变成多内存,那系统的处理数据就会提升很大。所以出现了 PageCache 机制。
程序运行的时候,具有「局部性」,所以通常刚被访问的数据在短时间内再次被访问的概率很高,于是可以用 PageCache 来缓存最近被访问的数据,当空间不足时淘汰最久未被访问的缓存。
再者在读取某一块数据时候,可以认为接下来很有可能会提取下一块的内容。PageCache 使用了「预读功能」。
所以 PageCache 主要有两个优点:
当然也不是所有场合都适合使用 PageCache 机制,比如在读取大文件时候会出现以下的现象,导致 PageCache 成了累赘。
暂用过多的内存空间,真正需要被缓存的热点文件不能使用 PageCache。
读取文件时候往往会用到 DMA ,大文件下没有享受到缓存带来的好处,但却耗费 DMA 多拷贝到 PageCache 一次。
说到 PageCache 时候不得不提 BufferCache,因为它们俩一起构成了 Linux 的文件缓存。
Linux 的文件缓存分为部分,一个是 PageCache,另一个是 BufferCache;一个 PageCache 包含多个 BufferCache。
如下图:
PageCache 具有缓存最近被访问的数据、预读等优点,能大幅提升系统的处理速度,但对于大文件先,往往是不使用 PageCache 技术的。
想知道 Linux 在处理大文件是怎么操作的,请看这篇博文 《Linux - 怎么实现大文件传输》。