mmap'ed文件 - 确定哪个页面是脏的

时间:2012-08-24 13:20:47

标签: linux x86-64 mmap

我有一个固定大小的文件。该文件已被ftruncate()编辑为size = N * getpagesize()。该文件具有固定大小的记录。我有一个编写过程,它通过mmap(... MAP_SHARED ...)映射整个文件,并随机修改记录(像数组一样访问)。我有一个读者进程也可以做mmap(... MAP_SHARED ......)。现在,由于编写器进程写入随机记录,读取器进程需要确定哪个页面在其映射中已更改。有没有办法在用户空间中做到这一点?我在Linux上 - x86_64。欢迎平台特定代码/黑客。谢谢你的时间。

编辑:我没有自由修改编写进程的代码,以某种方式向我提供修改记录的指示。

2 个答案:

答案 0 :(得分:4)

相关文件:

  1. http://lwn.net/Articles/230975/
  2. https://www.kernel.org/doc/Documentation/vm/pagemap.txt

    • 确定您的虚拟页面的数量(即除以4096),乘以8,然后在/proc/*/pagemap中找到该位置
    • 读取8个字节,这是页面帧编号(PFN)
    • 打开/proc/kpageflags,并寻找PFN,读取8个字节
    • 如果设置了DIRTY标志,则页面变脏(换句话说,作者已写入该页面)
    • 对映射文件中的每个页面重复

答案 1 :(得分:2)

这将是非常非常难看的。最有可能的是,这不值得尝试这样做,你最好把改变你的任何东西改成这个角落。

您可以使用受锁保护的共享位图。作者保护每个页面。如果它写入受保护的页面,则会出错。您必须捕获故障,取消保护页面,锁定位图,并在位图中设置与该位对应的位。这将告诉读者该页面已被修改。

读者操作如下(这是痛苦的部分):

  1. 锁定位图。

  2. 制作已修改页面的列表。

  3. 将修改过的页面列表传达给编写者。编写者必须再次保护这些页面并清除位图中的位。作者必须等待读者在开始阅读之前完成此操作,否则更改可能会丢失。

  4. 读者现在可以阅读修改后的页面。