确定fork之后的内存是否为copy-on-write

时间:2014-08-30 04:22:57

标签: c unix memory-management fork

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

对于给定变量,使用&运算符访问的虚拟内存地址对于分叉进程看起来是相同的,即使这些进程在该变量中存储不同的值也是如此。有没有办法确定单独进程中的变量是否存储在同一物理地址?有没有办法确定它们是不是?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

也许你可以摆弄你的虚拟内存ulimit,把它锁定到一些小数字,这样修改一个页面会让你过来并给你一个信号。如果您可以使它完全正常工作,那么这对系统细节非常敏感。

如果您需要特定于Linux的解决方案,并且您正在运行2.6.34或更高版本的内核,this Q&A应该可以为您提供帮助。这不是一件轻而易举的事。