【发布时间】:2012-12-05 00:35:20
【问题描述】:
今天我参加了一个关于 linux 进程的讲座。老师说:
- fork() 返回后,子进程准备执行
- 由于 Copy On Write 机制,fork-exec 序列可以保证防止不必要的父内存复制
我所说的 fork-exec 序列是这样的:
if(!fork())
{
exec(...);
}
i = 0;
据我所知翻译成这个(用伪asm写的):
call fork
jz next
call exec(...)
next:
load 0
store i
让我们假设 parent 已被授予足够的 CPU 时间来一次执行上述所有行。
- fork 返回 0,因此跳过第 3 行
- 当 0 存储在“i”中时,子级尚未执行,因此 COW 开始执行 (不必要地)复制父母的记忆。
那么在这种情况下如何防止不必要的复制? 看起来不是,但我认为 linux 开发人员足够聪明,可以做到这一点;)
可能的答案:孩子总是先跑(调用 fork() 后,父母被抢占) 1. 这是真的吗? 2. 如果是,是否保证在所有情况下都防止不必要的复制?
【问题讨论】:
-
我不认为 COW 是这里的角色。
标签: process linux-kernel fork