从没有文件句柄的情况下清除MEM映射文件中的OS缓存



我需要强迫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);

最新更新