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

时间:2017-09-12 16:56:16

标签: c linux mmap

我正在研究的程序需要保存一些关于它的每个项目的信息 输入。由于要处理的物品数量巨大,我无法保留 内存中的数据(我在第一遍中迭代输入并记录 信息)。

我想将额外的数据放入虚拟内存中,但希望它能够实现 内存变得稀缺时的磁盘(即/何时/,不是/如果/。它将变得稀缺)。

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

程序现在可以愉快地读取和写入映射区域,一切都很好。

直到程序存在。然后内核开始写这一切现在没用了 数据到磁盘,虽然该文件不再打开或链接。我首先想到的 内核会意识到数据不再可访问,但是 显然不是。所以我首先打电话给madviseMDV_REMOVE 程序结束时,由于没有帮助,我还添加了MDV_DONTNEED 好。两者都无法解决我的问题。

最糟糕的是,这会阻止我的机器,因为每次编写任何其他程序 make(就像我的文本编辑器)必须等待这个长时间运行的写入完成。

有没有办法说服内核不要将这些数据写入磁盘?

1 个答案:

答案 0 :(得分:0)

通过评论,似乎使用交换可以满足您的需求,作为文件存储的替代方案。如果是这种情况,我认为最好的办法就是在tmpfs分区上使用一个文件,就像你已经完成的那样。用于此目的的最佳tmpfs分区位于/dev/shm

只需在/dev/shm中打开一个文件,将其截断为您需要的大小,将其映射并取消链接,就像您已经完成的那样。 / dev / shm使用主内存作为后备存储",但如果内存很短,它将被换出。

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

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