gpt4 book ai didi

unix - 谁知道unix fork的历史?

转载 作者:行者123 更新时间:2023-12-03 08:31:20 25 4
gpt4 key购买 nike

Fork 是 unix 中的一个很好的工具。我们可以用它来生成我们的副本并改变它的行为。但我不知道 fork 的历史。

有人可以告诉我这个故事吗?

最佳答案

实际上,与许多基本 UNIX 功能不同,fork 是一个相对较晚的人 (a)。

UNIX 中最早存在的多个进程由几个(固定数量的)进程组成,每个终端一个,连接到 PDP-7 机器 (b)。

基本思想是给定终端的 shell 进程将接受来自用户的命令,定位程序文件,将一个小的 bootstrap 加载到高内存并跳转到它,传递足够的引导代码细节以加载程序文件.

bootstrap 代码在将程序加载到低内存(覆盖 shell )后,将跳转到它。

当程序完成时,它会调用 exit 但它不像我们今天所知道和喜爱的 exit。这个 exit 将简单地重新加载 shell 并使用几乎与最初加载程序相同的方法运行它。

因此,它实际上更像是一个基本的 exec 命令,该命令将您当前的程序替换为同一进程空间中的另一个程序。

shell 程序将 exec 您的程序然后,当您的程序完成后,它会再次调用 exec shell 程序 exit

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

从双向 exec 来看,将 fork 添加为进程复制器以协同工作实际上并没有那么大的飞跃。虽然许多系统直接运行另一个程序,但正是这种“只添加需要的”方法负责 UNIX 中 forkexec 之间的职责分离。它还产生了一个非常简单的 fork 函数。

如果您对 Unix 的各种特性 (c) 的早期历史感兴趣,那么您就不能错过 Dennis Ritchie 在 1979 年在澳大利亚的一次 session 上发表、随后由 AT&T 发表的文章 The Evolution of the Unix Time-Sharing System

(a) 虽然我的意思是后来者,因为宇宙中四种基本力的分离是“迟到的”,发生在大爆炸后大约 0.00000000001 秒。。

(b) 由于在评论中提出了关于 shell 最初是如何启动的问题,因此有大量资源在 The Unix Heritage Society 上保存了 Unix 的早期源代码,特别是 the source code archives ,特别是 first edition

第一版的 init.s 文件展示了如何创建固定数量的 shell 进程(稍微重新格式化):

    ...
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 字段,以及各种其他琐事,当然,通常只有 super 极客才感兴趣。

关于unix - 谁知道unix fork的历史?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5091254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com