FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章与书籍
  • UNIX 四分之一世纪
  • Unix 痛恨者手册
  • 《Unix 四分之一世纪》翻译项目
  • 前言
  • 致谢
  • 简介
  • 序幕
    • 太空序曲
    • 1969 年夏到 1970 年秋
    • 机械计算和电子计算
    • 操作系统
    • MAC 项目:CTSS 和 Multics
  • 一款系统的诞生
    • PDP-11
    • 1971 年,第 1 版
    • 1971-1973,C 语言和管道
    • 1973,第一篇论文
    • 法律 第一幕
  • 是什么让 UNIX 成为 UNIX?
    • 用户 第一幕
    • 为什么是 Unix
    • 风格和工具
    • PWB 和 MERT
    • 实用工具
  • Unix 的传播与发展
    • 用户 第二幕
    • 伯克利 Unix 第一幕
    • 第 7 版
    • 伯克利 Unix 第二幕
    • 商业 Unix
    • DEC
    • 法律 第二幕
  • Unix 产业
    • /usr/group
    • Sun 和 JAW
    • 标准
  • 现状
    • 互相争斗的 Unix
    • 衍生版本
    • OSF 和 UI
    • VAX 后的伯克利 Unix
    • 法律 第三幕
  • 落幕
    • 结语:Unix 为什么能成功
    • 进一步阅读
    • 人物与术语表
    • 附图
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
在GitHub上编辑
导出为 PDF
  1. Unix 的传播与发展

第 7 版

Unix 第 7 版于 1979 年 6 月从实验室发布,带来了若干重大改进:支持大型文件系统;不限制用户账户数量;提高了系统的可靠性。Steve Johnson 称第 7 版为“首个可移植的 Unix”。正因为这些改进及其包含的大量新命令,第 7 版产生了巨大影响。以下是若干精选命令:

命令:

  • at

  • sed

  • awk

  • tail

  • calendar

  • tar

  • cb

  • touch

  • cd

  • uucp

  • cpio

  • uux

  • cu

系统调用:

  • deroff

  • ioctl

  • expr

子程序:

  • malloc

  • find

  • stdio

  • lex

  • lint

  • string

  • m4

  • make

游戏:

  • backgammon

awk(Aho-Weinberger-Kernighan)、lint(Johnson)、make(Feldman)和 uucp(Lesk)本身就已经足够强大,但第 7 版还包含了更多内容。《第七版程序员手册》已扩展到近 400 页,并配有两本 400 页的补充卷。这一版本的 Unix 配备了完整的 Kernighan 和 Ritchie C 语言编译器;更为复杂的 Bourne shell(sh);Dick Haight 的 find、cpio 和 expr 命令,以及大量的 include 文件。

然而,第 7 版 Unix 也有一个重大缺陷:其性能比大多数经过“调优”的第 6 版系统更差。用户们开始着手改进这一状况。Bill Joy(在伯克利)改变了 VAX-11/780 文件系统中数据块的大小,他的实现随后由 Jeff Schriebman 于 1980 年 4 月移植到 PDP-11/70(Schriebman 当时已从伯克利加入 UniSoft)。1979 年 12 月,Ed Gould(当时在伯克利)将缓冲区移出了内核地址空间。Joy 改进了 VAX 上的 stdio 库,Tom Ferrin(在加州大学旧金山分校)则将这些改动移植到 PDP-11。Holmdel 的 Tom London 改进了从用户空间到内核空间的输出字符传输。Ferrin 还编写了动态 unibus 分配方案。新南威尔士大学的 John Lions 提出了一种新的目录路径名处理方法,UNSW 也提供了新的进程表搜索代码。RAND 公司 Bruce Borden 提供了 symorder 程序。Ferrin 还重写了 copyseg() 和 clearseg() 的部分代码。

这一整套改进通过 PDP-11 发行版 2.8.1BSD 提供给了社区,并由 Ferrin 在 1982 年 1 月于加州圣莫尼卡举办的 USENIX 会议上宣布。用户极大地提升了第 7 版的性能。

我详细叙述这些内容,是因为这些对第 7 版的改进来自工业界与学术界,来自美国和澳大利亚,且全部被纳入了后续 BSD 和 AT&T Unix 的版本中。

第 7 版还催生了多款 Unix 移植版本:32 位实现版本,以及 XENIX2(微软与 Santa Cruz Operation 合作开发的第一个针对 Intel 8086 芯片的 Unix 实现,XENIX1 基于第 6 版);还包括针对 Z8000 和 68000 芯片的 Unix 实现。Holmdel 版本的 32V 也催生了 3BSD 及其所有后代。

32 位 Unix 的演变由 Steve Johnson 向我叙述。

我最早知道的 Unix 移植版本是由两名普林斯顿大学的学生完成的。他们将大量重要的 Unix 命令和操作系统接口——shell 移植到了 IBM 360 系统上,我记得是一个 TSS 系统。他们在那个系统上运行了相当多的 Unix 代码,并且使用了我们的 IBM C 编译器,同时借助我们的技术支持。这项工作非常有吸引力。我们还雇佣了其中一名学生 Tom Lyon 在夏季做实习,他将所有第 6 版的命令移植到了中心的 Amdahl 机器上。

我记得我们决定移植 Unix 时选择了 Interdata 机器,这段经历很有意思,因为 IBM 曾经愿意免费给我们提供一台 360 机用两年半,但 Dennis 不喜欢 IBM 的通道程序,他试着写过这些程序。

Marc Donner 向我解释道:

IBM 360 是多处理器系统。输入输出并非直接在 CPU 和设备之间进行,而是由称为“通道”的辅助处理器控制。通道处理器是一种专用引擎,能直接与各种设备通信(通过所谓的“通道程序”,其实就是类似机器码的代码)……它通过写入主内存并向 CPU 发送中断的方式向处理器传输数据;CPU 则用类似的方式向通道发送数据……

早期,通道较为简单,只有通道命令而非通道程序,但随着设备变得越来越复杂,需要更复杂的处理,通道编程的功能也越来越复杂。

我认为从未有过适合通道编程的高级编程工具,因此通道编程一直是一项极其晦涩的工作,只有极少数人能够胜任。

回到 Johnson 的叙述:

IBM 比 Interdata 更能理解我们当时提出的方案。另一个有力竞争者是 DEC 20,那是一台 36 位机器,Dennis 对它的评论是,除非有人发明出 10 轨磁带驱动器,否则他不会移植到 DEC 20。因为将 36 位写入 8 位宽的字节,这个问题对于 Unix 文件系统来说实在超出了它所能处理的范围……

Interdata 是我用过的最后一台真正使用带有穿线钢环(core-steel donuts)的机器。后来 Interdata 被 Perkin-Elmer 收购,接着又卖给了 Concurrent,我想是这样。

有一天,我们收到了一封来自一个我们从未听说过的地方——澳大利亚伍伦贡的信,说他们已经移植了 Unix 并做了些什么。他们采用了一种相当不同的系统开发方法,更像是一种自顶向下的方式。他们先在现有系统上实现了一个 Unix 系统调用层,然后慢慢地逐步替换内核中的部分,直到它看起来像 Unix 内核。这种方法很有趣,因为它使他们能很快在机器上运行起来。但总体来说,我们完成工作所用的时间差不多。

我指出,当时伍伦贡大学还非常新。Johnson 笑了。

他说:“那确实是我收到过最令人震惊的一封信。你简直无法想象。我们以为自己在科学上开辟了新天地,结果一个我们从未听说过的、远在地球另一端的大学写信来说‘我们觉得你们会对我们在做的这件事感兴趣’。”

关于 Interdata,有一个有趣的小插曲——那台机器有很多问题,其中一些是我遇到过最奇怪的问题,涉及分页硬件。在第六版 Unix 中,常见的错误处理方式是通过返回 -1 作为指针值来表示错误。一个常见的程序错误就是忘了检查这个返回的指针是否为错误值,结果直接使用了这个指针。

而在 Interdata 上,如果你尝试访问地址为 -1 的字,实际上会触发两个错误:一是对齐错误,因为 -1 不是对齐的;另一个是内存错误,因为访问超出了内存边界。问题是,这两个错误信号间隔几拍时钟,导致微码引擎在处理第一个错误时收到了第二个错误,结果引擎的状态完全紊乱了。它不仅完全丢失了之前的位置,还使接下来几条指令执行错乱,直到自己重新同步。

这是硬件本身的缺陷。任何用户程序只要把 -1 放进寄存器,就能让它陷入疯狂状态。我们还遇到过这种机器,只有关机再开机才能恢复正常。

于是 Dennis 和我去找 Interdata 交涉。

我说:“看,我们整个贝尔系统有上百台机器在用 Unix,还有这些应用软件。你们这儿有台 32 位机器,我们的 Unix 系统需要硬件做几点改动,然后你们就可以大卖 Unix 系统了。”他们说:“不行。”

于是,Dennis 和我成为那段历史上的第一批人——做过一次 Unix 移植后,决定再也不想做第二次的人。

标注为 1979 年 1 月的第七版 UNIX 程序员手册封面上,没有写上 Dennis 和 Ken 的名字。封面标题是:

UNIX™ 分时系统

Unix 已经将近十年历史。

有趣的是,那时 Unix 已经进入高中阶段了。1979 年 1 月,Brian Harvey 来到波士顿郊区的林肯 - 萨德伯里区域高中,负责“建立计算机部门”。他说服了校董会通过债券筹资购买设备,还说服了 DEC 给高中大幅度折扣。结果是用 5 万美元买到了价值约 20 万美元的设备。

不过,安装过程中“需要几个地方的计算机科学家共同合作……因为我们的 PDP-11 使用了一种第 7 版原版 Unix 不能支持的磁盘驱动器类型。”Harvey 的 15 岁学生们解决了这个问题以及其他几个难题;他们开始编写实用程序,成为 Unix 社区的一部分,分享他们的软件。Harvey 说:

几个月后,我们的系统终于上线了,当时孩子们和我都感到非常激动,因为我们接到了另一个刚购买了 Unix 系统、遇到和我们相同磁盘问题的计算中心的电话。我们能够给他们发送一盘根据他们配置量身定制的启动磁带。从那时起,我们通过 USENIX 贡献了学生编写的软件……

高中生从 Unix 中受益,原因和成年程序员一样:它的灵活性、能够修改其工作方式的能力,以及支持它的各种工具。

第 7 版带来了比当地糖果店还要多的“好东西”——无论程序员的“商店”在哪里。第 8 版从 BSD 移植了 vi(由 Bill Joy 编写)、curses(Ken Arnold 编写)和 termcap(Joy 编写)。Arnold 的 curses 又是游戏对软件开发影响的一个例子:curses 是一款屏幕处理和优化程序,Arnold 写它是为了让玩 rogue 游戏更方便。顺便一提,Arnold 还写了 fortune 和许多其他有用且有趣的程序。但是尽管第 7 版很有用,它也让人烦恼。不因为代码,完全不是这样。正如 Andy Tanenbaum 所说:

当 AT&T 发布第 7 版时,开始意识到 UNIX 是一个有价值的商业产品,因此它以一种许可证发布了第 7 版,该许可证禁止在课程中研究源代码,以避免危及其作为商业秘密的地位。许多大学因此选择直接放弃 UNIX 的学习,只教授理论知识。[《操作系统》(1987 年)第 13 页]

Tanenbaum 的解决方案是“从头编写一个新的操作系统,使其与 UNIX 兼容”,但“不含一行 AT&T 的代码”。Tanenbaum 将其命名为 MINIX。

上一页伯克利 Unix 第一幕下一页伯克利 Unix 第二幕

最后更新于7天前