V7
Unix第7版在1979年6月由贝尔实验室发布,它有几个主要的提升:它可以使用更大的文件系统,不限制用户的数量,提高了可靠性。Steve Johnson将第7版称之为“第一个可移植的Unix”。这个版本具有极大的影响力因为它增加了很多新的命令。让我列举一部分:
命令 | |
---|---|
at | awk |
calendar | cb |
cd | cpio |
cu | deroff |
expr | f77 |
find | lex |
lint | m4 |
make | refer |
sed | tail |
tar | touch |
uucp | uux |
系统调用 | |
ioctl | |
子例程 | |
malloc | stdio |
string | |
游戏 | |
backgammon |
awk(Aho Weinberger Kernighan),lint(Johnson),make(Feldman),以及uucp(Lesk)这几个就足够了,但是第7版远比这更多。
第7版的编程手册增加到了400页,还有两卷400页的附加补充。这个Unix中包含了一个完整的Kernighan和Richie C语言编译器,一个更加成熟的shell sh(Bourne Shell),Dick Haight的find,cpio和expr,还有很多的包含头文件。
这些所有的放在一起,第7版Unix有了一个缺点:它的性能比大部分的第6版要低一些,特别是这些都已经经过“调优”。人们开始为改善这个问题而工作。伯克利的Bill Joy修改了VAX-11/780机器上Unix文件系统的的数据块大小,他的实现被Jeff Schriebman在1980年1月移植到PDP-11/70上面(他离开伯克利去了UniSoft)。1979年12月,那时还在伯克利的Ed Gould将缓冲区移出内核寻址空间。Joy修改了VAX上的stdio库,旧金山加利福尼亚大学的Tom Ferrin又将这个改动移植到了PDP-11。霍姆德尔的Tom London优化了用户空间到内核空间的字符移动。Ferrin还写了一个动态单一总线分配方案。新南威尔士大学的John Lions提议一个新的目录路径名命名规则,新南威尔士大学还提供了一个处理表格搜索的新代码。RAND公司的Bruce Borden提供了symorder程序。Ferrin还重写了copyseg()
和clearseg
的部分代码。所有这些来自社区的优化提升被收录到一个PDP-11发行版:2.8.1 BSD。1982年1月Ferrin在加利福尼亚州圣塔莫尼卡举办的USENIX会议上宣布了这个BSD的新版本。用户们因此大幅提高了第7版Unix的性能。
我在这里花费这么多的篇幅是因为第7版是来自工业和学术界,来自美国和澳大利亚。并且所有这些都包含进将来的BSD和AT&T Unix发布版。
第7版同时也在移植方面有所增强:32的XENIX2是第一个可以在8086芯片上运行的Unix(XENIX1是基于第6版)。第7版也可以运行在Z8000和68000芯片上。32V版本(来自Holmdel)则增强了3BSD和它所有的后续版本。
32位Unix的进化故事是Steve Johnson告诉我的:
我知道的第一个完整移植的Unix是普林斯顿大学的学生做的。他们移植了很大一部分Unix命令和系统的接口shell到IBM 360上。我想是TSS系统。他们令人惊奇的让Unix在那个系统上运行。他们使用了我们的知识和IBM C语言编译器,这是一件诱人的事情。那个夏天我们雇佣了这些学生中的一位,Tom Lyon,他移植第6版Unix所有的命令到Amdahl。
我记得当我们决定移植Unix。我们选择了Interdata。这是一段有趣的经历因为IBM将为我们提供2年半的360机器,但是Dennis不喜欢IBM的channel程序,他试着自己重写这些东西。
Marc Donner向我解释说:
IBM 360是一台多处理器机器。I/O操作不直接在CPU和设备间直接进行,而是在由一个叫做“channels”的附属处理器来控制。channel处理器是一个特定用途的芯片,它知道怎样和不同的处理器通信(在“channel程序”的控制下写入机器码)...它通过向主存写入数据并给CPU一个中断来传送数据,从CPU接受数据也是通过类似的计算...
在早期channel是很简单的,并且相比channel程序,channel命令更方便一些。但是随着设备越来越复杂,需要更越来越多的处理,channel的编程工具也变得越来越复杂。
我不认为曾经有更高级的channel编程工具,结果就是它的处理方式变得极端复杂晦涩,只有很少几个人能搞处理好。
回到Johnson:
IBM意识到我们比Interdata做的更好。还有一个很强大的竞争对手是DEC 20,它是一个26位机器,Dennis对它的评价是如果有人发明了10路纸带驱动器,他就会将Unix移植到DEC 20。基于8位字节写36位数据的问题是这远远超过了Unix文件系统所能处理的极限...
Interdata是我使用的最后一台带有核心的机器——一个绕线的铁圈。Interdata后来被卖给Perkin-Elmer,我想他们又再把它卖给了Concurrent。
有一天我们收到了一封来自大利亚伍伦贡的信件,这是以我我们从来没有听说过的地方。那里的几个家伙说他们已经移植了Unix并且发来了方法。他们使用一种非常不同的方式让系统工作,一种自上而下的做法。他们在系统之上实现了一个中间层,由这个中间层来实现Unix系统调用,然后逐渐的将中间层向下移动并最终让系统内核看起来像Unix内核。这是一种非常有意思的方式,因为它可以在机器上非常快速的实现。但是总的来说,我们其实用了差不多的总时间。
我指出伍伦贡大学在那时是刚刚建立的。Johnson笑了起来。
好吧,你可以想象得到,这当然是我收到过的最让人吃惊的一封信。我们认为自己在科学上有了新的突破,但是有些我们从来没有听过的大学突然跨过半个地球写信过来说“我们觉得你们会对我们做的东西感兴趣”。
关于Interdata一个有趣的小插曲——有大量的问题,其中有些非常奇怪的问题我从来没有遇到过——关系到硬件分页。在Unix第6版使用返回值为-1的指针代表错误的做法已经非常普遍。一个常见的编程错误是当返回指针的时候忘了检查错误并且继续使用指针。在Interdata上,如果你试图访问位于-1位置的数据,你会引起两个错误:一个是对齐错误,因为-1不知字对齐的,另一个是内存错误,因为你超出了内存的地址范围。而且这又引发了一系列的时钟问题,因为微码引擎需要几个时钟周期来处理错误,当它处理其中一个错误时,另一个错误又发送过来,这时微码引擎就会被被阻塞。这不仅会丢失当前程序执行到的位置,阻塞的引擎还会在它恢复同步以前错过执行接下来的几个指令。
那时硬件固有的问题。任何用户程序都可以将-1放入寄存器然后让机器陷入无法预料的状态。此时我们只能通过切断电源后再通电让机器恢复正常。所以Dennis和我一起谈了谈Interdata。
我说:“看,贝尔实验室正用着这么多这个机器(那时有几百台),你拿到了一个32位机器,我们有我们的Unix系统和应用程序。我么所要做的就是针对硬件的一些修改,之后伙计们就可以开始出售Unix系统了”。然后他们说:“不”。
所以Dennis和我完成了一个Unix移植,然后决定再也不去做下一个。这在漫长的历史中还是第一次。
时间到了1979年1月,第7版《UNIX编程手册》的封面上既没写Dennis的名字也没写Ken的名字。上面写着:
UNIX™ TIME-SHARING SYSTEM
Unix已经差不多有10年的历史了。
有趣的是,它已经进入中学校园。1979年1月Brian Harvey去了波士顿郊外的林肯萨德布瑞中学,“去建立一个计算机部门”。它和学校董事会商讨设备合作,并劝说DEC给中学一个客观的折扣。结果是20万美元的设备只收了5万美金。无论如何,安装过程“经过了几个地方的计算机科学家共同的努力...因为我们的PDP-11有不能处理原始的第7版Unix磁盘”。Harvey帮助15岁大的学生么解决了这个以及其他很多的问题,他们开始写一些有用的程序。后来他们成为Unix社区的一部分,开始分享他们的软件。Harvey说:
几个月后我们的系统传播了出去。当我们接到来自另一个计算机中心的电话时我和孩子们简直太兴奋了。他们买了Unix系统并且刚好遇到了和我们一样的问题,我们按照他们的配置寄去了一个定制后的启动纸带。从那时起,我们开始通过USENIX贡献学生写的软件...
中学生开始和成人程序员一样从Unix中获益:它的灵活,可以修改它工作方式的能力,还有支持它的广泛的工具。
第7版包含了比本地宝库更多的“好东西”——无论程序员存咋哪里。第8版移植了vi(Bill Joy),curses(Ken Arnold),和来自BSD的termcap(Joy)。Arnold的curses是有一个游戏影响软件开发的例子:curses是Arnold为了玩rogue更容易而写的一个屏幕处理和优化程序。顺便说一句,Arnold还写了forune和其他许多有用并且有意思的程序。但是就像实用的第7版,也非常让人厌烦。这远不止是代码的问题,就像Andy Tanenbaum说的:
当AT&T发布了第7版,人们开始意识到Unix是一个非常有价值的商业产品,所以为了避免危及商业机密,第7版的授权阻止在校学生以外的人们获得源码。很多大学简单的取消了UNIX的学习,转而只教理论部分。
Tanenbaum的解决方案是“从头写一个和UNIX兼容的新操作系统”,里面“没有AT&T的一行代码”。Tanenbaum将这个新系统命名为MINIX。