2

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

编辑:我无权修改编写器进程的代码以某种方式给我修改记录的指示。

4

2 回答 2

5

相关文件:

  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设置了标志,则页面是脏的(换句话说,作者已写入)
    • 对映射文件中的每一页重复
于 2013-07-17T16:41:59.853 回答
2

这将是非常非常丑陋的。最有可能的是,尝试这样做是不值得的,而且你最好把画你的东西改成这个角落。

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

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

  1. 锁定位图。

  2. 列出修改过的页面。

  3. 将该修改页面列表传达给作者。编写者必须再次保护这些页面并清除它们在位图​​中的位。写入者必须等待读取者完成此操作,然后才能开始读取,否则更改可能会丢失。

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

于 2012-08-24T13:25:57.337 回答