从没有文件句柄的内存映射文件中清除操作系统缓存

时间:2019-05-03 18:27:44

标签: linux paging mmap oscache

我需要强制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()是否会清除缓存的页面?

1 个答案:

答案 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);