谁知道unix fork的历史?

问题描述:

叉是unix.We一个伟大的工具,可以用它来生成我们的备份,并改变其behaviour.But不知叉的历史。谁知道unix fork的历史?

是否有人能告诉我的故事吗?

+1

[故事在叉](http://en.wikipedia.org/wiki/Fork()) – Alpine 2011-02-23 13:12:54

+0

高山的链接是非常好的。如果您想要完整故事,请参阅http://www.amazon.com/Design-Operating-System-Prentice-Hall-Software/dp/0132017997/ref=sr_1_1?s=books&ie=UTF8&qid=1301206203&sr=1-1设计由Maurice Bach提供的unix操作系统。如果没有这两个,你通过Google搜索发现了什么?请分享您的链接。 – shellter 2011-03-27 06:12:50

事实上,与许多基本功能UNIX,fork后发先至(一)

内UNIX多个进程的最早存在由几个(固定数目)过程,这是附着到PDP-7机每一个终端(B)

其基本思想是给定终端的shell进程会接受来自用户的命令,找到程序文件,将一个小引导程序加载到高内存并跳转到该程序,并将足够的详细信息传递给引导代码加载程序文件。

自举代码,所述程序加载到低存储器(覆盖壳)后,将然后跳转到它。

当程序结束时,它会调用exit,但它不像我们今天所知道和喜欢的exitexit将只需重新加载外壳和使用几乎使用摆在首位,以加载程序相同的方法运行。

所以它看起来更像一个基本exec命令,与另一个替换当前的程序,在同一个进程空间中的一个。

外壳将exec你的程序的话,你的程序做的时候,它会再次exec外壳通过调用exit

这种方法类似于在当时的许多其他交互系统,包括了Multics从那里UNIX得名发现。

从双向exec来看,它实际上并不是将fork作为流程复制器联合使用的巨大飞跃。虽然许多系统直接运行另一个程序,但这是“只需添加所需”的方法,它负责UNIX中forkexec之间的职责分离。它也导致了一个非常简单的功能。

如果你有兴趣在不同的功能(C)的早期历史的Unix,你无法走过去的文章The Evolution of the Unix Time-Sharing System由丹尼斯·里奇,在澳大利亚1979年的会议上提出,随后由AT出版& T.


(一)虽然我的意思是在这个意义上后来者,在宇宙中的四种基本力的分离是“迟到”,在大爆炸后发生了一些0.00000000001秒。 < /幽默>。


(二)因为一个问题是在作为壳最初是如何开始了评论提出,那里The Unix Heritage Society是一个伟大资源保持很早就源的Unix代码的结束,特别是the source code archives和,特别是first edition

从第一版的init.s文件显示外壳进程的固定数目如何被创建(略微重新格式化):

... 
    mov $itab, r1  /address of table to r1 
1: 
    mov (r1)+, r0  /'x, x=0, 1... to r0 
    beq 1f    /branch if table end 
    movb r0, ttyx+8  /put symbol in ttyx 
    jsr pc, dfork  /go to make new init for this ttyx 
    mov r0, (r1)+  /save child id in word offer '0, '1, etc 
    br  1b    /set up next child 
1: 
    ... 

itab: 
    '0; .. 
    '1; .. 
    '2; .. 
    '3; .. 
    '4; .. 
    '5; .. 
    '6; .. 
    '7; .. 
    0 

在这里可以看到其产生用于每个连接的终端的处理的代码段。这些是硬编码值的日子,不涉及自动检测终端数量。在itab零终止表用于创建一些进程,并希望从代码的评论解释如何(唯一可能棘手的位是标签 - 尽管有多个1标签,你分支到给定最近的一个方向,因此1b表示最近的1标签在向后的方向)。

显示的代码只是处理表格,调用dfork为每个终端创建一个进程并开始登录提示getty。反过来,getty程序最终启动了shell。从这一点来看,就像我在这个答案的主要部分所描述的那样。


(C)无路径(和使用临时链接来解决此限制),有限的过程中,为什么会出现在密码文件中GECOS字段,以及各种其他的琐事,一般有趣只当然还有超级极客。

+0

因此,听起来好像是为了创建子任务而将另一个程序的映像加载到现有进程中的概念早于fork的发明,但操作系统是如何创建每个shell进程的?内核必须有一些方法可以从静态可执行映像创建一个新进程* ex nihilio *,如果是这样,为什么没有这个功能暴露在userland中? – Dai 2016-04-06 05:45:36

+0

@戴,看我的更新,特别是脚注'(a)'。它没有被暴露的原因可能是因为它没有必要。早期的UNIX没有管道或后台进程,它只是每个终端运行一个进程,并且有一对一的映射。换句话说,用户永远不会创建一个新的进程,他们只会使用已经存在的进程来加载一个新的程序。 – paxdiablo 2016-04-06 07:35:12

+0

很好的答案,但顶部的“幽默”与这个问题根本没有密切关系。 – 2016-09-28 13:58:22