今天我参加了关于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
让我们假设父级已被授予足够的CPU时间来执行一次运行中的所有行 .
-
fork返回0,因此跳过第3行
-
当0存储在"i" child避免't yet exec' ed时,因此COW会复制(不必要地)父级内存 .
So how is unnecessary copying prevented in this case? 看起来不是,但我认为Linux开发人员足够聪明,可以做到;)
Possible answer :child总是先运行(在调用fork()之后父对象被删除)1 . 这是真的吗? 2.如果是,这是否可以保证在所有情况下防止不必要的复制?
2 回答
基本上两个人可以读同一本书 . 但是,如果一个人开始在边缘写作笔记,那么另一个人在此之前需要该页面的副本 . 没有写入页面边缘的人不希望看到书中的其他人注释 .
答案基本上是必要的复制 - 托管任何变更数据的页面 - 发生,而不必要的复制 - 自从fork以来没有被任何一个进程改变的页面 - 没有 .
后者通常不仅包括未修改的数据,还包括那些持有程序本身和已加载的共享库的数据 - 通常是可以共享的许多页面,而不是必须复制的几个页面 .
一旦子进程调用了exec函数,就会终止共享(以及将来对copy-write-copy的任何需要) .