我需要强制操作系统清除用于映射文件的页面。我没有文件描述符,所以无法使用 posix_fadvise。
我们的应用程序通过将它们映射到内存来缓存大量文件。在文件被映射后(即我们从 中获得了指针mmap()
),我们关闭文件。当稍后我们必须清理缓存时,我们也想清除操作系统缓存中的页面。也就是说,我们想要取消映射文件,并执行类似posix_fadvise(POSIX_FADV_DONTNEED)
的操作,但此时文件描述符不可用。
流程如下所示:
//caching stage
fd = open("file");
data = mmap(fd, <mmap flags>);
close(fd);
//clean-up stage
munmap(data);
// posix_fadvise(???, POSIX_FADV_DONTNEED);
有没有办法清除没有文件描述符的缓存页面?
我考虑过以下两种解决方法:
- 保持文件打开,以便我在清理时拥有有效的描述符。但是,可能有数以万计的文件,并且将它们全部打开可能会影响操作系统性能。
- 保留文件路径,然后重新打开它只是为了获取描述符并调用
posix_fadvise()
. 但问题是:旧的映射区域会与同一个文件相关联吗?在这种情况下会fadvise()
清除缓存的页面吗?