我想编写一个小程序,演示在调用fork()
后操作系统是否正在使用copy-on-write。问题在于写入时复制对受影响的流程大多是透明的。
对于给定变量,使用&
运算符访问的虚拟内存地址对于分叉进程看起来是相同的,即使这些进程在该变量中存储不同的值也是如此。有没有办法确定单独进程中的变量是否存储在同一物理地址?有没有办法确定它们是不是?
答案 0 :(得分:5)
一般而言,在可移植到所有符合POSIX或类似POSIX的系统的意义上,没有,没有办法观察COW,尤其是不能在单个页面级别(您可能能够在更广泛的范围内观察它)如果系统提供这样的数字,则只有"可用"内存。但是在Linux上,您可以通过/proc/[pid]/pagemap
观察潜在共享进程。 /proc/kpagecount
和/proc/kpageflags
也可能包含相关信息,但您需要root才能访问它们。参见:
答案 1 :(得分:1)
我在这里推测,但我希望在过程中不可能。正如你所说,我们有效地拥有完美的地址空间副本。但是,您确实有一些唯一性,例如进程ID,因此可以将一个进程唯一值写入所选地址,然后将值写入文件或使用进程间通信(例如管道)来允许比较它们的价值的过程,因此确认它们现在是不同的。
答案 2 :(得分:1)