首页 文章

fork-exec中如何防止不必要的复制?

提问于
浏览
1

今天我参加了关于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 回答

  • 0

    基本上两个人可以读同一本书 . 但是,如果一个人开始在边缘写作笔记,那么另一个人在此之前需要该页面的副本 . 没有写入页面边缘的人不希望看到书中的其他人注释 .

  • 1

    答案基本上是必要的复制 - 托管任何变更数据的页面 - 发生,而不必要的复制 - 自从fork以来没有被任何一个进程改变的页面 - 没有 .

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

    一旦子进程调用了exec函数,就会终止共享(以及将来对copy-write-copy的任何需要) .

相关问题