【问题标题】:Determine if memory after fork is copy-on-write确定fork后的内存是否是写时复制
【发布时间】:2014-10-24 02:20:42
【问题描述】:

我想编写一个小程序,演示调用fork() 后操作系统是否使用写时复制。问题是写时复制对受影响的进程大多是透明的。

对于一个给定的变量,使用& 操作符访问的虚拟内存地址对于派生进程来说是相同的,即使这些进程在该变量中存储不同的值也是如此。有没有办法确定不同进程中的变量是否存储在同一个物理地址?有没有办法确定它们是否不是?

【问题讨论】:

    标签: c unix memory-management fork


    【解决方案1】:

    一般而言,就可移植到所有符合 POSIX 或类似 POSIX 的系统而言,不,没有办法观察 COW,尤其是在单个页面级别(您可能能够在更广泛的范围内观察它)如果系统提供这样的数字,则仅通过“可用”内存进行级别)。但在 Linux 上,您可以通过 /proc/[pid]/pagemap 观察潜在共享进程。 /proc/kpagecount/proc/kpageflags 也可能包含相关信息,但您需要 root 才能访问它们。见:

    https://www.kernel.org/doc/Documentation/vm/pagemap.txt

    【讨论】:

      【解决方案2】:

      我在这里推测,但我希望这个过程中这是不可能的。正如您所说,我们实际上拥有地址空间的完美副本。但是,您确实具有一些唯一性,例如进程 ID,因此可以将进程唯一值写入所选地址,然后将该值写入文件或使用进程间通信(例如管道)以允许比较它们的值并因此确认它们现在不同的过程。

      【讨论】:

        【解决方案3】:

        POSIX 没有指定写时复制行为,因此没有标准的方法来检测它,因为系统甚至可能不使用 COW。

        也许您可以调整您的虚拟内存 ulimit,将其锁定为某个较小的数字,这样修改页面就会让您结束并收到信号。如果您可以让它工作,这将对系统细节非常敏感。

        如果您需要特定于 Linux 的解决方案,并且您正在运行 2.6.34 或更高版本的内核,this Q&A 应该可以帮助您。这不是微不足道的。

        【讨论】:

          猜你喜欢
          • 2015-11-14
          • 2020-07-27
          • 2014-06-04
          • 2018-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-11
          • 1970-01-01
          相关资源
          最近更新 更多