如何在Linux中操作页面缓存?

时间:2011-02-08 13:27:29

标签: linux caching memory

我想知道在页面缓存中缓存了哪些文件,并希望以实际方式释放特定文件的缓存空间。我可以编写内核模块,甚至可以根据需要修改内核代码。谁能给我一些线索?

3 个答案:

答案 0 :(得分:4)

首先,内核不维护页面缓存中所有文件的主列表,因为它不需要这些信息。相反,给定一个inode,您可以查找关联的页面缓存页面,反之亦然。

对于每个页面缓存struct pagepage_mapping()将返回其所属的struct address_spacehost struct address_space成员标识拥有struct inode,然后您可以获取inode编号和设备。

答案 1 :(得分:2)

  

mincore()返回一个向量,指示调用进程的虚拟内存的页面是否驻留在核心(RAM)中,因此如果引用则不会导致磁盘访问(页面错误)。内核返回有关从地址addr开始的页面的驻留信息,并继续查找长度字节。

要测试当前映射到您的进程的文件是否在缓存中,请使用其映射地址调用mincore 要测试任意文件是否在缓存中,请打开并映射它,然后按照上述步骤进行操作。

有一个建议的fincore()系统调用,它不需要首先映射文件,但是(此时)它还没有普遍可用。

(然后madvise(MADV_DONTNEED) / fadvise(FADV_DONTNEED)可以从缓存中删除部分映射/文件。)

答案 2 :(得分:1)

您可以使用

从Linux下的页面缓存中释放文件的内容
posix_fadvise(fd, POSIX_FADV_DONTNEED

从Linux 2.6开始,这将立即消除缓存给定文件或文件部分的页面缓存部分;调用阻塞直到操作完成,但posix不保证该行为。

请注意,如果页面已经被修改,它将不会有任何影响,在这种情况下,您想要执行fdatasync或类似的第一次。

编辑:对不起,我没有完全阅读你的问题。我不知道如何判断页面缓存中当前有哪些文件。遗憾。