是否可以丢弃共享映射上的脏页?

Is it possible to discard dirty pages on a shared mapping?

我正在处理的程序需要保存它的每一项的一些信息 输入。由于要处理的项目数量很大,我无法保留 内存中的数据(我在第一遍中遍历输入并记录 信息)。

我想将额外的数据放入虚拟内存中,但希望它转到 当内存变得稀缺时磁盘(那是/when/,而不是/if/。它将变得稀缺)。

目前我创建了一个(希望)合适大小的稀疏文件,mmap 整个 东西,关闭并且之后不像文件。我取消链接文件的原因是我 程序一退出就不需要这些信息了。

程序现在可以愉快地读写映射区域了,一切正常。

直到程序存在。然后内核开始写这一切现在没用了 数据到磁盘,尽管文件不再打开或链接。我首先想到 内核会意识到数据不再可访问,但是 显然不是。因此,我首先在 MDV_REMOVE 处调用了 madvise 程序结束时,由于这没有帮助,我还添加了 MDV_DONTNEED 作为 出色地。两者都没有解决我的问题。

最糟糕的是,每次编写任何其他程序时,这都会阻塞我的机器 使(就像我的文本编辑器)必须等待这么长的 运行 写入才能完成。

有什么方法可以说服内核不将此数据写入磁盘?

查看评论,使用交换作为文件存储的替代方案似乎可以满足您的需求。如果是这样的话,我认为你最好的选择是像你所做的那样在 tmpfs 分区上使用一个文件。用于该目的的最佳 tmpfs 分区位于 /dev/shm.

只需在 /dev/shm 中打开一个文件,将其截断为您需要的大小,mmap 并取消链接,就像您已经完成的一样。 /dev/shm 使用主内存,因为它是 "backing store",但如果内存不足,它将被换出。

使用交换的优点是不会强制刷新在程序存在时仍然适合内存的页面。紧接着,这些页面立即被识别为不需要,并被丢弃。这应该可以解决您的问题,同时仍然允许您调整大小等。

它的额外好处是几乎不需要更改您当前的代码:-)