我需要强迫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);
有没有办法清除没有文件描述符的缓存页面?
我考虑过遵循两个解决方法:
- 保持文件打开,以便我在清理时具有有效的描述符。但是,可能有数万个文件,使它们都打开可能会影响OS性能。
- 保留文件路径,然后重新打开它只是为了获取描述符并致电
posix_fadvise()
。但是问题是:旧映射区域是否与同一文件关联?在这种情况下,fadvise()
会清除缓存的页面?
第二个选项有效。稍后重新打开文件时,映射区域与之关联,并使用新文件描述符卸载映射页面的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);