Page Cache

文件一般存放在硬盘(机械硬盘或固态硬盘)中,CPU并不能直接访问硬盘中的数据,而是需要先将硬盘中的数据读入到内存中,然后才能被CPU访问。由于读写硬盘的速度比读写内存要慢很多,所以为了避免每次读写文件时,都需要对硬盘进行读写操作,Linux内核使用页缓存(Page Cache)机制来对文件中的数据进行缓存。

image.png

当用户对文件进行读写时,实际上是对文件的页缓存进行读写。所以对文件进行读写操作时,会分以下两种情况进行处理:

  • 当从文件中读取数据时,如果要读取的文件偏移量所对应的页缓存是否存在,如果存在就把页缓存中的数据拷贝到应用程序的内存中。否则,内核首先会申请一个空闲的内存页(页缓存),然后从文件中读取数据到页缓存,并且把页缓存的数据拷贝给用户。
  • 当向文件中写入数据时,如果要写入的文件偏移量所对应的页缓存是否存在,如果存在那么直接把新数据写入到页缓存即可。否则,内核首先会申请一个空闲的内存页(页缓存),然后从文件中读取数据到页缓存,并且把新数据写入到页缓存中。对于被修改的页缓存,内核会定时把这些页缓存刷新到文件中。

Page Cache 是由内核管理的内存,位于 VFS(Virtual File System) 层和具体文件系统层(例如 ext4,ext3)之间。应用进程使用 read/write 等文件操作,通过系统调用进入到VFS层,根据O_DIRECT标志,可以使用Page Cache作为文件内容的缓存,也可以跳过Page Cache不使用内核提供的缓存能力。

另外,应用程序可以使用mmap ,将文件内容映射到进程的虚拟地址空间,可以像读写内存一样直接读写硬盘上的文件。进程的虚拟内存直接和Page Cache映射。通过mmap,减少了数据从磁盘到用户空间的复制次数,提高了文件读写的效率。传统的文件读写需要将数据从磁盘读取到内核缓冲区,再从内核缓冲区复制到用户空间。而使用 mmap 后,数据可以直接在磁盘和用户空间之间进行传输,避免了中间的内核缓冲区复制过程。

1. 参考链接

一文看懂 | 什么是页缓存(Page Cache)-腾讯云开发者社区-腾讯云 (tencent.com)