我需要强制OS清除用于映射文件的页面。我没有文件描述符,因此无法使用posix_fadvise。
我们的应用程序通过将许多文件映射到内存来缓存许多文件。映射文件后(即,我们从mmap()
获得了指针),我们关闭了文件。当稍后需要清理缓存时,我们也要清除OS缓存中的页面。也就是说,我们要取消映射文件,并执行类似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()
是否会清除缓存的页面?答案 0 :(得分:0)
第二个选项有效。稍后重新打开文件时,映射的区域与之关联,并使用新的文件描述符调用posix_fadvise
会卸载映射的页面:
//caching stage
fd = open("file");
data = mmap(fd, <mmap flags>);
close(fd);
//clean-up stage
fd = open("file");
munmap(data);
posix_fadvise(fd, POSIX_FADV_DONTNEED);
close(fd);