【发布时间】:2014-10-24 02:20:42
【问题描述】:
我想编写一个小程序,演示调用fork() 后操作系统是否使用写时复制。问题是写时复制对受影响的进程大多是透明的。
对于一个给定的变量,使用& 操作符访问的虚拟内存地址对于派生进程来说是相同的,即使这些进程在该变量中存储不同的值也是如此。有没有办法确定不同进程中的变量是否存储在同一个物理地址?有没有办法确定它们是否不是?
【问题讨论】:
标签: c unix memory-management fork
我想编写一个小程序,演示调用fork() 后操作系统是否使用写时复制。问题是写时复制对受影响的进程大多是透明的。
对于一个给定的变量,使用& 操作符访问的虚拟内存地址对于派生进程来说是相同的,即使这些进程在该变量中存储不同的值也是如此。有没有办法确定不同进程中的变量是否存储在同一个物理地址?有没有办法确定它们是否不是?
【问题讨论】:
标签: c unix memory-management fork
一般而言,就可移植到所有符合 POSIX 或类似 POSIX 的系统而言,不,没有办法观察 COW,尤其是在单个页面级别(您可能能够在更广泛的范围内观察它)如果系统提供这样的数字,则仅通过“可用”内存进行级别)。但在 Linux 上,您可以通过 /proc/[pid]/pagemap 观察潜在共享进程。 /proc/kpagecount 和 /proc/kpageflags 也可能包含相关信息,但您需要 root 才能访问它们。见:
【讨论】:
我在这里推测,但我希望在这个过程中这是不可能的。正如您所说,我们实际上拥有地址空间的完美副本。但是,您确实具有一些唯一性,例如进程 ID,因此可以将进程唯一值写入所选地址,然后将该值写入文件或使用进程间通信(例如管道)以允许比较它们的值并因此确认它们现在不同的过程。
【讨论】: