1

我需要强制操作系统清除用于映射文件的页面。我没有文件描述符,所以无法使用 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()清除缓存的页面吗?
4

1 回答 1

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);
于 2019-05-04T03:14:56.147 回答