今天我参加了一个关于 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. 如果是,这是否保证在所有情况下都防止不必要的复制?