Process 如何在fork exec中防止不必要的复制?
今天我参加了一个关于linux进程的讲座。老师说:Process 如何在fork exec中防止不必要的复制?,process,linux-kernel,fork,Process,Linux Kernel,Fork,今天我参加了一个关于linux进程的讲座。老师说: fork()返回后,子进程就可以执行了 由于写时复制机制,fork exec序列可以保证防止不必要地复制父内存 我所说的fork exec sequence是指类似的内容: if(!fork()) { exec(...); } i = 0; 据我所知,这可以转化为(用伪asm编写): 让我们假设父级已被授予足够的CPU时间,以便在一次运行中执行上述所有行 fork返回0,因此跳过第3行 当0存储在“i”中时,子对象还没有执行,所以CO
if(!fork())
{
exec(...);
}
i = 0;
据我所知,这可以转化为(用伪asm编写):
让我们假设父级已被授予足够的CPU时间,以便在一次运行中执行上述所有行
2.如果是,这能保证在所有情况下都能防止不必要的复制吗?答案基本上是,必要的复制——对托管任何更改数据的页面进行复制,而不必要的复制——对自fork以来任何一个进程都没有更改过的页面进行复制 后者通常不仅包括未修改的数据,还包括那些保存程序本身及其加载的共享库的数据——通常包括许多可以共享的页面,而只有少数页面必须复制
一旦子进程调用exec函数,共享(以及将来写入时复制的任何需要)就会终止。答案基本上是,必要的复制(托管任何已更改数据的页面)会发生,而不必要的复制(自fork以来未被任何一个进程更改的页面)不会发生 后者通常不仅包括未修改的数据,还包括那些保存程序本身及其加载的共享库的数据——通常包括许多可以共享的页面,而只有少数页面必须复制
一旦孩子调用exec函数,共享(以及以后写时复制的任何需要)就会终止。基本上两个人可以阅读同一本书。但是,如果一个人开始在页边空白处写笔记,那么另一个人就需要一份该页的复印件。没有在页边空白处书写的人不想看到书中其他人的注释。基本上两个人可以阅读同一本书。但是,如果一个人开始在页边空白处写笔记,那么另一个人就需要一份该页的复印件。没有在页边空白处书写的人不想看到书中其他人的笔记。我不认为COW在这里起作用。我不认为COW在这里起作用。
call fork
jz next
call exec(...)
next:
load 0
store i