【发布时间】:2013-03-13 09:15:10
【问题描述】:
在 Linux 上,如果你 fork() 和分叉的(子)进程退出,所有的虚拟内存页面在父进程中仍然标记为写时复制吗?
我认为这些页面将保持标记为 COW,因为其他任何东西实施起来可能会非常昂贵,可能需要每页的引用计数和其他昂贵的簿记。但是前几天我想知道,如果我分叉一个进程以在当前进程的“稳定快照”中执行一些代码。当子进程退出时会发生什么?父级中的所有内存页是否都标记为写时复制?这意味着在具有大量虚拟内存(例如 128GB+)的进程中分叉仅执行一些代码几分钟会导致父进程在数小时甚至数天后挥之不去的性能下降(更不用说 fork 调用本身)这不会便宜。)
我只是好奇 Linux 上的实际行为是什么(我不知道如何测试它。)
【问题讨论】:
-
我不确定,但你应该使用
posix_spawn,而不是fork,来运行外部程序。 -
IIRC,COW 设置在 both 父页面和子页面上。第一个得到页面错误并且页面被克隆(并且克隆的页面都没有设置COW)顺便说一句:你可以查看源代码。它是开源的,你知道...
标签: c linux fork virtual-memory