1.2.3 第三代(1965~1980):集成电路芯片和多道程序设计

20世纪60年代初期,大多数计算机厂商都有两条不同并且完全不兼容的生产线。一条是面向字的、大型的科学用计算机,诸如IBM 7094,主要用于科学和工程计算。另一条是面向字符的、商用计算机,诸如IBM 1401,银行和保险公司主要用它从事磁带归档和打印服务。

开发和维护两种完全不同的产品,对厂商来说是昂贵的。另外,许多新的计算机用户一开始时只需要一台小计算机,后来可能又需要一台较大的计算机,而且希望能够更快地执行原有的程序。

IBM公司试图通过引入System/360来一次性地解决这两个问题。360是一个软件兼容的计算机系列,其低档机与1401相当,高档机则比7094功能强很多。这些计算机只在价格和性能(最大存储器容量、处理器速度、允许的I/O设备数量等)上有差异。由于所有的计算机都有相同的体系结构和指令集,因此,在理论上,为一种型号机器编写的程序可以在其他所有型号的机器上运行。而且360被设计成既可用于科学计算,又可用于商业计算,这样,一个系列的计算机便可以满足所有用户的要求。在随后的几年里,IBM使用更现代的技术陆续推出了360的后续机型,如著名的370、4300、3080和3090系列。zSeries是这个系列的最新机型,不过它与早期的机型相比变化非常之大。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

360是第一个采用(小规模)芯片(集成电路)的主流机型,与采用分立晶体管制造的第二代计算机相比,其性能/价格比有很大提高。360很快就获得了成功,其他主要厂商也很快采纳了系列兼容机的思想。这些计算机的后代仍在大型的计算中心里使用。现在,这些计算机的后代经常用来管理大型数据库(如航班定票系统)或作为web站点的服务器,这些服务器每秒必须处理数千次的请求。

“单一家族”思想的最大优点同时也是其最大的缺点。原因在于所有的软件,包括操作系统OS/360,要能够在所有机器上运行。从小的代替1401把卡片复制到磁带上的机器,到用于代替7094进行气象预报及其他繁重计算的大型机;从只能带很少外部设备的机器到有很多外设的机器;从商业领域到科学计算领域等。总之,它要有效地适用于所有这些不同的用途。

IBM(或其他公司)无法写出同时满足这些相互冲突需要的软件。其结果是一个庞大的又极其复杂的操作系统,它比FMS大了约2~3个数量级规模。其中包含数千名程序员写的数百万行汇编语言代码,也包含成千上万处错误,这就导致IBM不断地发行新的版本试图更正这些错误。每个新版本在修正老错误的同时又引入了新错误,所以随着时间的流逝,错误的数量可能大致保持不变。

OS/360的设计者之一Fred Brooks后来写过一本既诙谐又尖锐的书(Brooks,1996),描述他在开发OS/360过程中的经验。我们不可能在这里复述该书的全部内容,不过其封面已经充分表述了Fred Brooks的观点,一群史前动物陷入泥潭而不能自拔。Silberschatz等人著作(2005)的封面也表达了操作系统如同恐龙一般的类似观点。

抛开OS/360的庞大和存在的问题,OS/360和其他公司类似的第三代操作系统的确合理地满足了大多数用户的要求。同时,它们也使第二代操作系统所缺乏的几项关键技术得到了广泛应用。其中最重要的应该是多道程序设计(multiprogramming)。在7094机上,若当前作业因等待磁带或其他I/O操作而暂停时,CPU就只能简单地踏步直至该I/O完成。对于CPU操作密集的科学计算问题,I/O操作较少,因此浪费的时间很少。然而,对于商业数据处理,I/O操作等待的时间通常占到80%~90%,所以必须采取某种措施减少(昂贵的)CPU空闲时间的浪费。

解决方案是将内存分几个部分,每一部分存放不同的作业,如图1-5所示。当一个作业等待I/O操作完成时,另一个作业可以使用CPU。如果内存中可以同时存放足够多的作业,则CPU利用率可以接近100%。在内存中同时驻留多个作业需要特殊的硬件来对其进行保护,以避免作业的信息被窃取或受到攻击。360及其他第三代计算机都配有此类硬件。

阅读 ‧ 电子书库
图 1-5 一个内存中有三个作业的多道程序系统

第三代计算机的另一个特性是,卡片被拿到机房后能够很快地将作业从卡片读入磁盘。于是,任何时刻当一个作业运行结束时,操作系统就能将一个新作业从磁盘读出,装进空出来的内存区域运行。这种技术叫做同时的外部设备联机操作(Simultaneous Peripheral Operation On Line,SPOOLing),该技术同时也用于输出。当采用了SPOOLing技术后,就不再需要IBM 1401机,也不必再将磁带搬来搬去了。

第三代操作系统很适于大型科学计算和繁忙的商务数据处理,但其实质上仍旧是批处理系统。许多程序员很怀念第一代计算机的使用方式。那时,他们可以几个小时地独占一台机器,可以即时地调试他们的程序。而对第三代计算机而言,从一个作业提交到运算结果取回往往长达数小时,更有甚者,一个逗号的误用就会导致编译失败,而可能浪费了程序员半天的时间。

程序员们的希望很快得到了响应,这种需求导致了分时系统(timesharing)的出现。它实际上是多道程序的一个变体,每个用户都有一个联机终端。在分时系统中,假设有20个用户登录,其中17个在思考、谈论或喝咖啡,则CPU可分配给其他三个需要的作业轮流执行。由于调试程序的用户常常只发出简短的命令(如编译一个五页的源文件),而很少有长的费时命令(如上百万条记录的文件排序),所以计算机能够为许多用户提供快速的交互式服务,同时在CPU空闲时还可能在后台运行一个大作业。第一个通用的分时系统,兼容分时系统(Compatible Time Sharing System,CTSS)是MIT(麻省理工学院)在一台改装过的7094机上开发成功的(Corbató等人,1962年)。但直到第三代计算机广泛采用了必需的保护硬件之后,分时系统才逐渐流行开来。

在CTSS成功研制之后,MIT、贝尔实验室和通用电气公司(GE,当时一个主要的计算机制造厂商)决定开发一种“公用计算服务系统”,能够同时支持数百名分时用户的一种机器。它的模型借鉴了供电系统——当需要电能时,只需将电气设备接到墙上的插座即可,于是,在合理范围内,所需要的电能随时可提供。该系统称作MULTICS(MULTiplexed Information and Computing Service),其设计者着眼于建造满足波士顿地区所有用户计算需求的一台机器。在当时看来,仅仅40年之后,就能成百万台地销售(价值不到1千美元)速度是GE-645主机10 000倍的计算机,完全是科学幻想。这种想法同现在关于穿越大西洋的超音速海底列车的想法一样,是幻想。

MULTICS得到一种混合式的成功。尽管这台机器具有较强的I/O能力,却要在一台仅仅比Intel 386 PC性能强一点的机器上支持数百个用户。可是这个想法并不像表面上那么荒唐,因为那时的人们已经知道如何编写精练的高效程序,而这种技巧随后逐渐丢失了。有许多原因造成MULTICS没有能够普及到全世界,至少它不应该采用PL/1编写,因为PL/1编译器推迟了好几年才完成,好不容易完成的编译器又极少能够成功运行。另外,当时的MULTICS有太大的野心,犹如19世纪中期Charles Babbage的分析机。

简要地说,MULTICS在计算机文献中播撒了许多原创的概念,但要将其造成一台真正的机器并想实现商业上的巨大成功的研制难度超出了所有人的预料。贝尔实验室退出了,通用电气公司也退出了计算机领域。但是M.I.T.坚持下来并且最终使MULTICS成功运行。MULTICS最后成为商业产品,由购买了通用电气公司计算机业务的公司(Honeywell)销售,并安装在世界各地80多个大型公司和大学中。尽管MULTICS的数量很小,但是MULTICS的用户们却非常忠诚,例如,通用汽车、福特和美国国家安全局直到20世纪90年代后期,在试图让Honeywell更新其硬件多年之后,才关闭了他们的MULTICS系统,而这已经是在MULTICS推出之后30年了。

目前,计算服务的概念已经被遗弃,但是这个概念是可以回归的,以大量的、附有相对简单用户机器的、集中式Internet服务器形式回归。在这种形式中,主要工作在大型服务器上完成。而回归的动机可能是多数人不愿意管理日益过分复杂的计算机系统,宁可让那些运行服务器公司的专业团队去做。电子商务已经向这个方向演化了,各种公司在多处理器的服务器上经营各自的电子商场,简单的客户端连接着多处理器服务器,这同MULTICS的设计精神非常类似。

尽管MULTICS在商业上失败了,但MULTICS对随后的操作系统却有着巨大的影响,详情请参阅有关文献和书籍(Corbató等人,1972;Corbató和Vyssotsky,1965;Daley和Dennis,1968;Organick,1972;Saltzer,1974)。还有一个曾经(现在仍然)活跃的Web站点www.multicians.org,上面有大量关于系统、设计人员以及其用户的信息资料。

另一个第三代计算机的主要进展是小型机的崛起,以1961年DEC的PDP-1作为起点。PDP-1计算机只有4K个18位的内存,每台售价120 000美元(不到IBM 7094的5%),该机型非常热销。对于某些非数值的计算,它和7094几乎一样快。PDP-1开辟了一个全新的产业。很快有了一系列PDP机型(与IBM系列机不同,它们互不兼容),其顶峰为PDP-11。

一位曾参加过MULTICS研制的贝尔实验室计算机科学家Ken Thompson,后来找到一台无人使用的PDP-7机器,并开始开发一个简化的、单用户版MULTICS。他的工作后来导致了UNIX操作系统的诞生。接着,UNIX在学术界,政府部门以及许多公司中流行。

有关UNIX的历史到处可以找到(例如Salus,1994)。这段故事的部分放在第10章中介绍。现在,有充分理由认为,由于到处可以得到源代码,各种机构发展了自己的(不兼容)版本,从而导致了混乱。UNIX有两个主要的版本,源自AT&T的System V,以及源自加州伯克利大学的BSD(Berkeley Software Distribution)。当然还有一些小的变种。为了使编写的程序能够在任何版本的UNIX上运行,IEEE提出了一个UNIX的标准,称作POSIX,目前大多数UNIX版本都支持它。POSIX定义了一个凡是UNIX必须支持的小型系统调用接口。事实上,某些其他操作系统也支持POSIX接口。

顺便值得一提的是,在1987年,本书作者发布了一个UNIX的小型克隆,称为MINIX,用于教学目的。在功能上,MINIX非常类似于UNIX,包括对POSIX的支持。从那时以后,MINIX的原始版本已经演化为MINIX 3,该系统是高度模块化的,并专注于高可靠性。它具有快速检测和替代有故障甚至已崩溃模块(如I/O设备驱动器)的能力,不用重启也不会干扰运行着的程序。有一本叙述其内部操作,并在附录中列出源代码的书(Tanenbaum和Woodhull,2006),该书现在仍然有售。在因特网的地址www.minix3.org上,MINIX3是免费使用的(包括了所有源代码)。

对UNIX版本免费产品(不同于教育目的)的愿望,导致芬兰学生Linus Torvalds编写了Linux。这个系统直接受到在MINIX开发的启示,而且原本支持各种MINIX的功能(例如MINIX文件系统)。尽管它已经通过多种方式扩展,但是该系统仍然保留了某些与MINIX和UNIX共同的低层结构。对Linux和开放源码运动具体历史感兴趣的读者可以阅读Glyn Moody的书籍(2001)。本书所叙述的有关UNIX的多数内容,也适用于System V、MINIX、Linux以及UNIX的其他版本和克隆。