我想知道在页面缓存中缓存了哪些文件,并希望以实际方式释放特定文件的缓存空间。我可以编写内核模块,甚至可以根据需要修改内核代码。谁能给我一些线索?
答案 0 :(得分:4)
首先,内核不维护页面缓存中所有文件的主列表,因为它不需要这些信息。相反,给定一个inode,您可以查找关联的页面缓存页面,反之亦然。
对于每个页面缓存struct page
,page_mapping()
将返回其所属的struct address_space
。 host
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或类似的第一次。
编辑:对不起,我没有完全阅读你的问题。我不知道如何判断页面缓存中当前有哪些文件。遗憾。