1

今天我参加了一个关于 linux 进程的讲座。老师说:

  1. fork() 返回后,子进程准备执行
  2. 由于 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 时间来一次执行上述所有行。

  1. fork 返回 0,所以第 3 行被跳过
  2. 当 0 存储在“i”中时,孩子还没有被执行,所以 COW 开始复制(不必要地)父母的记忆。

那么在这种情况下如何防止不必要的复制呢? 看起来不是,但我认为 linux 开发人员足够聪明地做到这一点;)

可能的答案:孩子总是先跑(调用 fork() 后,父母被抢占) 1. 是这样吗?2. 如果是,这是否保证在所有情况下都防止不必要的复制?

4

2 回答 2

1

基本上两个人可以读同一本书。但是,如果一个人开始在页边空白处写笔记,那么另一个人在此之前需要该页的副本。没有写到页边距的人不想看到书中其他人的笔记。

于 2012-12-17T21:26:26.777 回答
0

答案本质上是必要的复制——托管任何被更改的数据的页面——发生,而不必要的复制——自分叉以来没有被任何一个进程更改的页面——不会发生。

后者通常不仅包括未修改的数据,还包括那些持有程序本身和它已加载的共享库的数据——通常是许多可以共享的页面,而只有少数必须复制。

一旦孩子调用了一个 exec 函数,共享(以及对未来写时复制的任何需要)就会终止。

于 2012-12-17T21:18:58.870 回答