今天我参加了一个关于linux进程的讲座。老师说:
通过fork-exec序列,我的意思是:
if(!fork())
{
exec(...);
}
i = 0;
据我所知,转换成这个(用伪asm编写):
call fork
jz next
call exec(...)
next:
load 0
store i
假设父级已被授予足够的CPU时间来在一次运行中执行上述所有行。
那么在这种情况下如何防止不必要的复制? 它看起来不是,但我认为Linux开发人员足够聪明,可以做到这一点;)
可能的答案:孩子总是先跑(父亲在调用fork()之后会被提前) 那是真的吗? 2.如果是,这是否可以保证在所有情况下防止不必要的复制?
答案 0 :(得分:1)
基本上两个人可以阅读同一本书。但是,如果一个人开始在边缘写作笔记,那么另一个人在此之前需要该页面的副本。没有写入页面边缘的人不希望看到书中的其他人注释。
答案 1 :(得分:0)
答案基本上是必要的复制 - 托管任何变更数据的页面 - 发生,而不必要的复制 - 自从fork以来没有被任何一个进程改变的页面 - 没有。
后者通常不仅包括未经修改的数据,还包括那些持有程序本身和已加载的共享库的数据 - 通常是可以共享的许多页面,而不是必须复制的几个页面。
一旦孩子调用了exec函数,就会终止共享(以及将来对copy-copy的任何需要)。