手动写回脏mmap区域

时间:2011-12-08 05:56:04

标签: c linux mmap virtual-memory

我希望mmap文件的某个区域,进行更改,然后msync(MS_INVALIDATE),以便我的内存更改丢失,或者,如果我喜欢这些更改,{{ 1}}将它们写回底层存储。

msync manpagemsync(MS_SYNC)上说明了以下内容:

  

当指定MS_INVALIDATE时,msync()将使与永久存储位置不一致的映射数据的所有缓存副本无效,以便后续引用在调用msync()之间的某个时间内获取与永久存储位置一致的数据以及对数据的第一个后续内存引用。

这给人的印象是MS_INVALIDATE应该重置将内存恢复到存储状态。但是,当我进行MS_INVALIDATE调用时,这些更改似乎已经进入设备。

  1. 我可以延迟或阻止数据自动写回设备吗?
  2. 是否可以仅使用手动回写操作?
  3. 备注

    • 底层存储空间可以是几TB。

1 个答案:

答案 0 :(得分:0)

如果这只是为了访问大文件并进行一些本地修改,只需执行MAP_PRIVATE并在您决定再次使用原始版本时丢弃映射。

在现代系统上,性能开销应该可以忽略不计:

  • 对于您的更改副本,系统只需要不同的物理 您更改的页面
  • 再次(再次)映射文件时,物理页面仍然是 在页面缓存中,不需要设备IO