我想知道什么文件caching在页面caching中,并且要实际释放特定文件的caching空间。 如果需要的话,我可以编写内核模块甚至修改内核代码。 任何人都可以给我一些线索吗?
首先,内核不会维护页面缓存中所有文件的主列表,因为它不需要这样的信息。 相反,给一个inode,你可以查看关联的页面缓存页面,反之亦然。
对于每个页面缓存struct page
, page_mapping()
将返回它所属的struct address_space
。 struct address_space
的host
成员标识拥有的struct inode
,从那里你可以得到inode号和设备。
mincore()
返回一个向量,该向量指出调用进程的虚拟内存页面是否驻留在内核(RAM)中,如果引用,则不会导致磁盘访问(页面错误)。 内核返回关于从地址addr开始的页面的驻留信息,并且继续长度字节。
要测试当前映射到进程中的文件是否在缓存中,请使用其映射地址调用mincore
。
要测试任意文件是否在缓存中,请打开并映射它,然后按照上述步骤操作。
有一个提议的fincore()
系统调用,不需要先映射文件,但是(现在这个时候)还不是一般可用的。
(然后madvise(MADV_DONTNEED)
/ fadvise(FADV_DONTNEED)
可以从缓存中删除映射/文件的一部分。)
您可以通过使用,在Linux下的页面缓存中释放文件的内容
posix_fadvise(fd, POSIX_FADV_DONTNEED
从Linux 2.6开始,这将立即摆脱缓存给定文件或部分文件的页面缓存部分; 这个调用会阻塞,直到操作完成,但是这个行为不能被posix保证。
请注意,如果页面已被修改,则不会产生任何影响,在这种情况下,您希望先执行fdatasync或类似操作。
编辑:对不起,我没有完全读你的问题。 我不知道如何判断当前哪些文件在页面缓存中。 抱歉。