【问题标题】:Are multiple MAP_PRIVATE mappings of the same file, in the same process, still private?在同一个进程中,同一个文件的多个 MAP_PRIVATE 映射是否仍然是私有的?
【发布时间】:2021-06-29 16:22:24
【问题描述】:

Linux mmap(2) 说:

MAP_PRIVATE 创建私有写时复制映射。映射的更新对映射同一文件的其他进程不可见,并且不会传递到基础文件。未指定在mmap() 调用后对文件所做的更改是否在映射区域中可见。

我特意询问这部分:“对其他进程映射同一个文件不可见”

但是这个进程中同一文件的其他映射呢?

我了解“更改......不会传递到基础文件”,但这并不能清楚地表明这些更改是否会影响同一文件的其他映射。 p>

以下相关问题不回答这个问题:

Nate Eldredge pointed out POSIX mmap 规范也没有指定此行为,仅说明:

如果指定MAP_PRIVATE,则调用进程对映射数据的修改应仅对调用进程可见,并且不应更改底层对象。

【问题讨论】:

  • 在我对 Ubuntu 20.04 x86-64 的测试中,同一进程中的 MAP_PRIVATE 映射不会相互更新。
  • 有趣的是,POSIX 似乎也没有指定这种情况下的行为:pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html
  • My test 还表明映射是私有的 w.r.t。彼此(这是我所期望的)。
  • 在规范中没有明确说明的情况下,什么是最有意义的?不难想象一个进程给定两个文件来处理,它映射和使用它们,却不知道它们是相同的。在这种情况下,映射应该是分开的,否则处理算法会认为正在发生意外的变化。作为替代方案,我们什么时候想要有意地映射一个文件两次并让更改出现在两个位置?这似乎是对地址空间的浪费,任何可以用它完成的事情都可以在没有它的情况下完成。所以实现者应该选择前者。
  • 我同意确定的行为(MAP_PRIVATE 始终进行 100% 私有映射,无论进程、文件或 fd 是什么)是有意义的。然而,对一个内核进行经验测试并不是一种完全安全的软件编写方式。这似乎是文档中的一个巨大差距。

标签: c linux mmap


【解决方案1】:

我认为

不得改变底层对象

明确意图。当您在同一进程中再次mmap 相同的基础对象时,您再次制作了基础对象的映射,其内容由该基础对象的内容决定。

诚然,它可以/应该更清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2019-02-26
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多