Modern Operating System 4th 中译

第三代(1965-80):IC与多道编程

在20世纪60年代,大多数计算机生产厂家有两道互不兼容的产品线。一方面,有面向字的,大规模科学计算机,如7094,被用于在科学和工程工业强度数值计算。另一方面,有面向字符的商用计算机,如1401,被广泛用于银行和保险公司的磁带存储、打印。

对计算机厂家来说,同时开发、维护两条完全不同的产品线是一个很大的负担。此外,许多计算机用户一开始需要一台小计算机,但是渐渐地他们需要一台更大的计算机,可以运行以前的应用程序,但是更快。

IBM试图通过System/360来解决这些问题。360是从1401到更大机型的一系列软件兼容的机器。这些机器只有价格和性能(最大内存,处理器速度,允许的I/O设备数量等等)的区别。因为它们有相同的架构和指令集,为一台机器编写的程序也可以运行在其他机器上,至少理论上可以。(但是正如Yogi Berra所说:“在理论上,理论和实践没有区别。在实践上,他们有区别”)因为360产品线被设计为既可以处理科学计算(如数值计算),也可以处理商业计算,同一个家族的产品可以满足所有客户的需求。在随后的多年,IBM推出了向后兼容的360产品线的接班人,使用了更多的现代技术,被称为370,4300,3080,以及3090。z系列是这条线的最近后裔,尽管和原来相比已经有了天壤之别。

IBM的360是主要计算机中第一个使用(小规模)IC(集成电路),从而在与普遍由独立晶体管制成的第二代计算机的竞争中提供性价比优势。这是一个非常成功的决定。同时兼容产品线的思想也被各厂家接受。这些机器的后代现在依然被使用,通常用于管理大型数据库(如机票预订系统)或者作高负载的web服务器。

单个产品线的最大优势恰恰也是它最大的软肋。所有的软件,包括操作系统,必须运行在所有可能的硬件之上。小至只是为了替代1401系列,将卡片拷贝到磁带的机器,大至替代7094系列,用于做天气预报以及其他大规模计算的计算机。它必须能够处理各种类型的设备,可以工作在商业环境或者科学环境。最重要的是,对于任何类型的客户,它都必须一样的可靠高效。

很明显IBM(或者任何试图这么做的)并不能写出一套软件满足这些互相冲突的条件。其结果是一个极其巨大而复杂的系统。可能有FMS代码数量级的两到三倍,由数千名程序员写的数百万行汇编代码组成,包含成千上万的bug,因此有必要在后续的更新中修复。然而修复数个已有bug时引入了新的bug,所以很长一段时间内bug总数大致不变。

Fred Brooks,OS/360的设计者之一,随后写了一本诙谐精辟的书(Brooks,1995),描述了他开发OS/360的经历。尽管在本书中总结它是不可能的,然而说明这个过程就像是一个深陷泥潭的怪兽。Silberschatz等人的文章也说明操作系统操作系统更像是恐龙。

尽管其巨大的体积和繁多的问题,OS/360和与它类似的其他第三代操作系统还是满足了大部分客户的需求。与第二代操作系统相比,它们还有众多的新功能。也许其中最重要的就是多道。在7094中,如果当前的作业等待磁带读取或者其他I/O操作,CPU就必须停下等待操作完成。在重度依赖CPU的科学计算中,I/O操作并不频繁,所以问题还不明显。然而在商业应用中,I/O等待占用了总时间的约90%,所以必须采取措施避免珍贵的CPU时间如此浪费。

解决方案是将内存分成数块,每块内存中放置一个作业,如图Fig. 1-5。当一项作业在等待I/O时,另外一个可以使用CPU。如果一次可以在内存中加载足够的作业,CPU使用率可以接近100%。同时在内存中安全地运行多个作业需要配备特殊的硬件以保护每项作业的内存空间免受其他作业的窥探。360以及其他第三代系统配备了这种硬件。

第三代操作系统另一个主要特点是可以在卡片被送到机房的时候就将程序读入磁盘。当一项作业完成后,操作系统就可以将一项新的作业载入内存并且运行。这项技术被称为后台,也可以用于输出。用于输出时就不需要1401,也不需要反反复复搬运磁带。

尽管第三代操作系统非常适合大型科学计算以及海量商业数据处理,他们依然是基本的批处理系统。许多程序员还是念念不忘第一代系统,他们可以完全操作计算机达数个小时,于是可以快速debug他们的程序。第三代操作系统中提交作业至获得输出间的间隔通常长达数个小时,因此一个逗号放错可能导致编译失败,并且浪费程序员半天的时间。所以程序员并不非常喜欢第三代操作系统。

这种对于快速响应的需求促成了分时系统(黑)的诞生。分时是多道编程的变种,每个用户有一个独立的在线终端。在分时系统中,如果当前有20个用户登录,并且其中的17个用户都在思考人生或者高谈阔论或者喝咖啡,CPU就可以为另外3个用户服务。因为程序员在debug时经常运行一些小命令(例如编译一个只有5页的程序)而不是大程序(例如排序一个上百行的文件),所以计算机可以在为数量可观的用户提供快速的交互式服务时同时在CPU空闲时后台完成一个大型批处理作业。CTSS(Compatible Time Sharing System,兼容分时系统)由MIT在一台特别改造的7094(Corbato ´ et al., 1962)上开发。然而直到必要的保护硬件在第三代计算机中普及之后,分时系统才真正变得流行。

在CTSS系统的成功之后,MIT,贝尔实验室以及通用电气公司(当时还是一个主要的计算机生产商)下决心着手开发“计算机服务”,即为一台可以同时支持上百个分时用户的计算机。就像是电力系统——当你需要电力时,只需要简简单单地插上插头,就可以随意使用取之不竭的电力。这个系统名为MULTICS(MULTiplexd Information and Computer Service)。它的设计师预见,当MULTICS建成,一台计算机即可提供整个Bostion所需的计算能力。这个建造一台比现有的GE-645主机快10000倍的电脑的主意是纯纯粹粹的科学幻想,听起来就像是现在建造超音速跨大西洋海底隧道一样。

MULTICS在某些意义上也是成功的。它的设计致力于在一台仅比Intel 386 PC稍快的计算机上支持上百个用户,尽管它的IO更强大一些。事实上这个目标并没有像它听起来一样疯狂,因为那时的人们擅长写短小而高效的程序,而现在的程序员已经逐渐失去了这个技能。MULTICS没能接管世界是有很多原因的,不仅仅是因为它是由PL/I语言编写,而PL/.I编译器不仅姗姗来迟而且极难正常工作,更因为MULTICS过分错误估计了它的时间——有点像18世纪Charles Babbage的分析机。

长话短说,MULTICS将许多开创性的想法引入了计算机文化,但是将这些开创性的想法转变成可用成熟的商业产品的难度是超出任何人预料的。贝尔实验室退出了这个工程,之后通用电气也退出了计算机行业。然而MIT坚持了下来,并且逐渐推出了可用的MULTICS版本。最终MULTICS被作为商业软件出售,全球总共有大约80家大公司和学校采用,销售方(Honeywell)收购了通用电气的计算机部门。因为用户量少,所以MULTICS用户非常高贵。用户包括General Motors,Ford,以及U.S. National Security Agency。其中的U.S. Security Agency更是在90年代才关闭了他们的MULTICS系统,那时离MULTICS发布已经过去30多年了。

20世纪将结束之时,计算机应当被公用的观念已经开始落伍。当然这个想法可能会在云计算时代归来。在云计算时代,小的计算终端(包括智能手机,平板电脑以及类似的设备)都被连接至远程的数据中心,计算任务由数据中心完成,而本地设备仅负责与用户交互。这么做的动机是大部分用户不愿意管理越来越复杂琐碎的计算机系统,而更愿意将这些工作交给数据中心运维等专业团队。电子商务公司已经在这个方向努力了。又例如许多公司使用多核心服务器运行电子邮箱服务端程序,接受众多的小设备的连接,就非常像MULTICS的设计理念。

尽管没有取得商业成功,MULTICS还是对后世的操作系统(尤其是UNIX及其衍生的操作系统,如FreeBSD,Linux,iOS以及Android)产生了重大影响。它产生了许多论文和书籍(Corbato etal., 1972; Corbato ´ and Vyssotsky, 1965; Daley and Dennis, 1968; Organick, 1972; and Saltzer, 1974),也有一个依然活跃的网站www.multicians.org,上面有关于这个系统,它的设计师以及用户的许多信息。

第三代计算机的另一个显著发展就是微型计算机的增长,最开始是DEC于1961年推出的PDP-1计算机。PDP-1只有4K 18bit的内存,但是每台机器售价达120000美元(低于7094价格的5%),尽管如此市场反应依旧极好。在特定的非数值计算任务中,它的表现几乎和7094一样快,由此诞生了一个新行业。很快就催生了一系列的PDP机型(不像IBM家族,每代之间均不兼容),直至PDP-11.

贝尔实验室一名工作于MULTICS项目的科学家Ken Thompson,随后找到了一台没人使用的PDP-7微机,并且决定写一个全新的单用户版的MULTICS。他的成果最终发展为UNIX操作系统,广泛流行于学术界,政府机构以及众多的商业公司。

UNIX的历史在别的地方有介绍(如 Salus,1994)。这些故事会在第十章介绍。因为它的源代码可以轻易获得,众多组织开发了他们自己的(互不兼容)的版本,局面变得混乱。其中两个主要版本是 System V,来自AT&T,以及 BSD(Berkeley Software Distribution),来自University of California at Berkeley。它们各自也有许多变种。为了使得写UNIX通用程序成为可能,IEEE制订了UNIX的通用标准,称为POSIX,大部分UNIX均支持这个标准。POSIX定义了一组UNIX必须支持的最小系统调用接口。事实上,不只是UNIX,一些其他的操作系统也支持POSIX标准。

另外值得一提的是,在1987年,本书作者(译者注:Andrew.S.Tanenbaum)发布了一个小的UNIX克隆版,命名为MINIX,用作教育目的。仅从功能上来讲,MINIX同UNIX很像,包括POSIX支持。之后原版发展到了MINIX 3,高度模块化并且致力于提供高可靠性。它可以检测并且替换出错甚至崩溃的模块(比如I/O设备驱动)而不需要关机重启,甚至不需要干扰正在运行的程序。它致力于提供非常高的可靠性和可用性。有专门的书籍描述它的内部实现并且也可以很容易得到它的源代码(Tanenbaum and Woodhull, 2006)。MINIX 3系统也可以在www.minix3.org免费获取(包括源代码)。

MINIX的一个自由的生产版本(同教学版本相对)由一个(作者的)学生Linus Torvalds编写完成,称为Linux。这个系统直接受MINIX的启发,并且支持MINIX的众多功能(例如 MINIX文件系统)。尽管经过许多人许多方式的改进,Linux与MINIX,UNIX在底层架构上依旧有许多共同点。对Linux历史和开源运动感兴趣的读者可以阅读Glyn Moody(2011)的书。本书关于UNIX的描述大多也适用于System V,MINIX,Linux以及其他的UNIX变体。