这本书最早知道也是从左耳朵耗子那里看到的,耗子叔推荐的书,必须要看看的。

Unix 发源地-AT&T 下的贝尔实验室

AT&T,即美国电话电报公司(American Telephone and Telegraph Company),由分布于美国各地的多个当地电话公司组合而成。在其发展历史的早期阶段,AT&T 意识到,它需要一个研究机构,系统解决在建设全国电话系统时遇到的科学和工程难题。1925 年,AT&T 创办研发子公司贝尔电话实验室(Bell Telephone Laboratories),意在解决这些难题。

1956 年,晶体管的发明者荣获诺贝尔奖。共有 9 项诺贝尔奖是因获奖者在贝尔实验室工作期间的成果而颁发的。贝尔实验室雇员还发明了负反馈放大器、太阳能电池、激光器、手机、通信卫星和电荷耦合器件(有了它,手机上的摄像头才能工作)等。

贝尔实验室持续投入,布局长远

贝尔实验室从全国范围内用户为每台电话缴纳的税款中获得回报。据迈克尔 · 诺尔(A. Michael Noll)的论文,AT&T 将营收的 2.8% 投入研发,其中基础研究投入约占营收的 0.3%。放到今天,这样的安排不知能起多大作用,但在那几十年里,电话系统因此获得了持续改进,许多基础科学发现也因此应运而生。

持续的资金投入是研究工作的关键保障。这意味着 AT&T 能布局长远,贝尔实验室的研究员们也能自由探索那些未必有短期回报,甚至可能永无回报的领域。现今世界已全然不同,多数人只做未来几个月的规划,功夫都花在了预测下一季度财务状况上。

CTSS 分时系统和 Multics 操作系统
当时最有创造性的操作系统是麻省理工学院于 1964 年推出的 CTSS(兼容分时系统)。在那个时代,大多数操作系统都采用“批处理”技术。程序员将程序打到穿孔卡上(那是很久以前的事了!),交给操作员,然后苦等几小时甚至几天,等待结果出来。

穿孔卡用高品质硬纸制成,每张卡片能保存最多 80 个字符,容纳一行程序的内容。6 行 C 语言程序得用 6 张卡片,如果要修改代码,就得替换卡片。

与此不同,CTSS 程序员使用类似打字机的设备(如下一章图3-1所示的Model 33 Teletypes“终端机”),设备直接连接或通过电话线连接到一台大型计算机,如拥有两倍于通常型号32K(32 768)个字长内存的IBM 7094。操作系统看顾每位登录用户,在用户之间快速切换,令每位用户误以为整台计算机都为我所用。这种技术叫作“分时”,(以我个人体验而言)它比批处理更为令人愉悦和有生产力。多数情况下,真的让人感觉不到有其他用户存在。

见到 CTSS 编程环境如此高效,麻省理工学院的研究员们决定做一个更好的版本。他们想做一套信息处理工具,向大众提供计算服务。1965年,他们开始设计 Multics 系统。Multics 意思是多路复用信息和计算服务(Multiplexed Information and Computing Service)。

过于复杂的 Multics

Multics 是个大项目,意图制造出强悍的新软件和比 IBM 7094功能更丰富的新硬件,所以麻省理工学院邀请了两家公司来帮忙。计算机制造商通用电气(General Electric,GE)公司负责设计和生产拥有全新硬件特性、能更好地支持分时和多用户体系的新计算机。由于贝尔实验室在 20 世纪 50 年代初就打造了自己的操作系统,拥有极丰富的经验,因此在这个项目中帮忙做操作系统。

Multics 本该前途无量,但其很快就陷入困境。回头看来,它算是第二系统效应(second system effect)的受害者。所谓第二系统效应,意思是在首个系统(如CTSS)创建成功后,打算创建一个新系统,修正旧系统的遗留问题,还要添加每个人期望的新特性,结果常常是塞了太多不同东西进去,最终得到过于复杂的系统。这就是 Multics 遇到的情况。在多份有关 Multics 的文件中都出现了“过度设计”(over-engineered)一词,用萨姆·摩根的话来说就是“同时爬好多棵树”。而且,项目参与方是一所高校和两家全无共性的公司,分布在美国的 3 个地方,即使对组织机构无甚研究的人也能料到会出问题。

1966 年至 1969 年,有六七个贝尔实验室研究员从事 Multics 相关工作,其中有道格·麦基尔罗伊、丹尼斯·里奇、肯·汤普森和彼得·诺伊曼。维克·维索斯基搬去贝尔实验室的另一处驻地后,彼得接替了他的职位。道格致力于在 Multics 上实现 PL/I。还在哈佛大学读书时,丹尼斯就在为 Multics 编写文档,加入贝尔实验室后,又参加开发设备 I/O(输入/输出)子系统。肯全力做 I/O 子系统,这段经历在他后来开发 Unix 时派上了用场。在 2019 年的一次采访中,他形容自己为 Multics 做的事是“巨轮上的一道凹槽,它搞出来的东西连我自己都不想用”。

到了 1968 年,尽管对能用上它的少数人而言,Multics 算是一个优秀的计算环境,但在贝尔实验室看来,作为一套信息处理工具,它已无法实现以合理的代价为实验室提供计算服务的目标,并且它太贵了。1969 年 4 月,贝尔实验室退出 Multics 项目,留下麻省理工学院和 GE 继续苦战。

Multics 最终还是完成了,起码是宣称成功了。直至 2000 年,它虽然没被广泛接受,但仍然持续得到支持和使用。很多好点子滥觞于 Multics,但它最持久的贡献却完全没人预料到:它影响了一个叫 Unix 的小操作系统,这个小系统诞生的部分原因是想摈弃 Multics 的复杂架构。

Unix 诞生 - 为了测试文件系统的吞吐量

PDP-7 于 1964 年推出,但计算机领域演进太快,到了 1969 年,它已经过时。这台机器本身不算很强大,只有 8K(8192)个 18 位字长的内存(16 KB),但其图形显示非常漂亮,所以肯就为它写了个太空旅行游戏。在这个游戏里,玩家可以漫游太阳系、探访各个行星。

但这台机器有一个问题,磁盘运转速度远高于计算机读写速度。为了解决这个古怪的问题,肯写了个磁盘调度算法来提升磁盘的总吞吐量。

Unix 是用来测试吞吐量之类的文件系统实现。实现出来之后,我发现很难用数据给它加上负载。我可以在循环中调用读/写操作,但做不了更复杂的事。这就是邦妮(Bonnie)去圣迭戈(San Diego)探望我父母时,我面临的状况。

我认为它已经很接近分时系统了,只是还缺少执行调用(exec call)、shell、编辑器和汇编器。(没有编译器)执行调用手到擒来。其他三个每周做一个——加起来正好是邦妮在那边待的时间。
计算机内存有 8k×18 位。4k 做内核,4k 供用户程序换入换出。

Unix 命名由来 - 用 uni 替代 multi

我记得自己站在办公室门口,和几个人讨论,其中好像有肯、丹尼斯和彼得 · 诺伊曼。那时系统还没名字。(如果我记忆准确的话)我提议,从拉丁词根看,Multics 意图提供“包罗万象”的功能,而新系统顶多择一而从,应该拿 uni 来替代 multi,叫它 “UNICS”。

也有人说,UNICS 这个名字是彼得·诺伊曼想出来的,代表“毫不复杂的信息与计算服务”(UNiplexed Information and Computing Service)。

Unix 被用来编写文字处理程序

直接申请买机器的企图失败了,但还有替代办法。贝尔实验室是巨大而富有成效的科研机构,产出大量专利申请。在那个时期,它几乎平均每天被授予一项专利。专利申请是文本文档,但有一些严苛的格式要求,例如要标出行号。既有的计算机系统无法应对这些奇怪的规则,所以专利部门计划向一间公司购买专门硬件来处理。虽然该公司宣称配套软件能够制作符合格式的申请书,但当时那套软件还是不能加行号。

乔·奥桑纳提议,专利部门可以用 PDP-11 准备专利申请材料,Unix 小组负责编写所需软件,包括能以合适格式输出申请书的文本格式化程序在内。而且,不会有人拿这台机器来做操作系统。

为什么 Unix 命令很短:因为打字很费劲

正在用一台 Model 33 Teletype 打字。这种电传打字机既慢又吵。它基本上是一种计算机控制的电子机械打字机,只能输出大写形式,每秒 10 个字符。Model 33 是 1963 年推出的,但更早的型号从 20 世纪 30 年代早期就开始广泛使用了。

Unix 中许多命令都很短,原因之一就是在 Mode 33 上输入非常费力,而且输出速度太慢。

系统调用 creat

顺便说一下,creat 系统调用之所以这么拼写,只能归咎于肯 · 汤普森的个人品位,没有其他什么好借口。罗布·派克曾经问肯,如果重写 Unix,他会做哪些修改。他的答案是什么?“我会在 creat 后头加上字母e。”

管道就像花园里的水管

将程序连接起来的想法由来已久。Unix 语境中最清晰的陈述之一出现在道格·麦基尔罗伊在 1964 年写的一份内部文件里。这份文件提出,“像花园水管那样”把程序接在一起。

回头看来,管道是 Unix 的主要贡献之一。正如丹尼斯 1984 年在 “The Evolution of the Unix Time-sharing System”(Unix 分时系统的演进)一文中写到的那样:
“同样一些命令,以简单方式持续使用,构成了 Unix 管道,这恰恰是管道的天才之处。实在需要脑洞大开,才能看到这种可能性并创造出这个概念。”

C 语言的发明

C 语言一直非常成功,是有史以来使用最广泛的语言之一。虽然它最初在 PDP-11 Unix 上诞生,但已经传播到了差不多每一款计算机上。正如丹尼斯在 1993 年提交到第二届编程语言史(History of Programming Languages)大会的论文中所说:
“C语言既古怪又有缺点,却获得了巨大的成功。虽然历史上的意外事件肯定有帮助,但 C 语言显然满足了人们对一种系统实现语言的需求,这种语言需要足够高效,足以取代汇编语言,但又足够抽象和流畅,足以描述各种环境下的算法和交互。”

BSD 伯克利发行版、比尔乔伊和 TCP/IP 接口

1973 年,AT&T 开始向高校发放 Unix 许可,只收取象征性的费用,不过大多数许可都针对 1975 年推出的第 6 版。也卖出一些第 6 版商业许可,索价高达 2 万美元,大概等于今时今日的 10 万美元。许可包括所有源代码,但不提供任何支持。

加利福尼亚大学伯克利分校是最活跃的许可获得者之一,该校的一些研究生对系统做出了重大贡献,最终演化出伯克利软件发行版(Berkeley Software Distribution,BSD)。BSD 是由最初的科研版 Unix 演变而来的两个主要分支之一。

1975 年和 1976 年,肯·汤普森在伯克利度过了一个休假年,教授操作系统课程。有个叫比尔·乔伊(Bill Joy)的研究生(图6-2)修改 Unix 的本地版本,添加了一些自己的程序,包括 vi 文本编辑器(现在仍然是最流行的 Unix 编辑器之一)和 csh(C 语言 shell)。比尔后来为 Unix 设计了至今仍在使用的 TCP/IP 网络接口。有了他的 socket 接口,就能用与文件和设备 I/O 相同的读写系统调用来读写网络连接,因此很容易添加网络功能。

迅速占领市场甚至是未来的市场,成为事实上的标准

Unix 确实有市场。甚至可以说,AT&T 通过向大学生赠送 Unix,无意中创造了这个市场。当大学生进入社会,受雇于有能力支付真金白银的公司时,他们就会需要它。

Unix 贡献及评价

Unix 及其主要创建者肯汤姆森和丹尼斯里奇的共享得到了认可,当他们在 1983 年获得 ACM 图灵奖时,该评选委员会表示:”Unix 系统的成功源于其高品味的关键概念选择及优雅的实现。Unix 系统模式引领了一代软件设计者对编程的新思考。Unix 系统的天才之处在于其框架,它使程序员能够相互倚重。

他们获得的其他荣誉包括成为美国国家工程院院士,以及荣获 2011 年日本信息与通信奖,获奖理由是:“与当时盛行的其他操作系统相比,他们的新型先进操作系统更简单、更快捷,而且具有方便用户的分层文件系统。

Unix 是与 C 语言共同开发的,C 语言至今仍被广泛用于编写操作系统,极大地提高了 Unix 源代码的可读性和可移植性。因此 Unix 已被嵌入式系统、个人计算机和超级计算机等各种系统所采用。

Unix 也是互联网发展的主要推动力。加利福尼亚大学伯克利分校开发了伯克利软件发行版 BSD,这是 Unix 的扩展版本,与互联网协议套件 TCP/IP 一起实现。BSD 的开发基于贝尔实验室在 1975 年连同其源代码一起分发给高校和研究机构的 Unix 第六版,这是开源文化的肇始。BSD Unix 帮助实现了互联网。”

本文由mdnice多平台发布


菜皮日记
21 声望1 粉丝

全干程序员