Unix父子进程关系

Unix父子进程关系,unix,operating-system,Unix,Operating System,我非常理解unix进程创建中的父子关系。但是我不理解它背后的原理:(为什么我们需要从当前进程中分叉来创建一个新的进程,然后用新代码覆盖它的映像(如果有的话)?理由是unix(至少最初)是由内核完成的“基本”操作 实际上,应用程序通常在和之间执行一些特定的操作,特别是对和的调用,也会忽略一些信号(可能有些系统调用在fork之前完成) 如果您希望一次使用一个系统调用来处理所有这些,那么它会非常复杂,而且灵活性也会降低 我建议读一些书,比如(它是免费的,在线的)或者另外的 相反,我发现创建一个进程和执

我非常理解unix进程创建中的父子关系。但是我不理解它背后的原理:(为什么我们需要从当前进程中分叉来创建一个新的进程,然后用新代码覆盖它的映像(如果有的话)?理由是unix(至少最初)是由内核完成的“基本”操作

实际上,应用程序通常在和之间执行一些特定的操作,特别是对和的调用,也会忽略一些信号(可能有些系统调用在
fork
之前完成)

如果您希望一次使用一个系统调用来处理所有这些,那么它会非常复杂,而且灵活性也会降低

我建议读一些书,比如(它是免费的,在线的)或者另外的

相反,我发现创建一个进程和执行一个程序的意图是很自然的,我真的不明白为什么你想把这两个操作结合起来


另请参阅我关于系统调用的回答。

因为在许多情况下(线程),这是您想要的,而且速度非常快。您可以像“没有明天”一样生成进程,您只需要为您实际需要使用它们的东西支付成本。这背后的基本原理是COW(写时复制)价格便宜:内核只需克隆页表(并设置标志以指示COW)。如果fork()后面有一个exec(),这有点浪费,但如果没有exec(),则在需要时子级的页面将出现故障。(历史旁注:fork()机制设计时,具有COW特性的MMU尚未发明)
fork
早在COW之前就存在了……最初的PDP-8 Unix没有COW;当时
fork
复制了整个64Kbyte地址空间……我知道,我添加了一个旁注。IIRC WE-32000是第一个使用MMU的体系结构。