操作系统用于管理计算机硬件、软件资源,并提供通用服务,是直接运行在计算机硬件上的基本系统软件。其他软件都必须在操作系统的支持下才能运行。操作系统可划分为批处理操作系统、分时操作系统等类型。实际上,发展到现在,分时操作系统、实时操作系统、个人操作系统、网络操作系统、分布式操作系统在不同的场景下都被广泛使用。本章将对操作系统的发展历史进行简要介绍。
在电子管计算机时代,计算机是没有系统软件的,只能在少数领域中得到运用,人们用机器语言编程。编写的程序是用纸带(或卡片)来表示的。用户先把纸带装到计算机上,然后启动输入机把程序和数据送入计算机,接着通过计算机控制台开关启动程序运行,计算完毕,输出机输出计算结果,用户卸下并取走纸带,如图1-1所示。
图1-1 人工时代的计算机使用流程
可以看出,这种方式效率很低,CPU有效运行时间极短,因为要等待大量的人工操作完成。而且用户独占机器,程序运行过程中计算机无法和程序员进行交互。为解决上述问题,人们开始研制不同的操作系统来适应计算机的发展。
批处理操作系统是加载在计算机上的一个系统软件,在它的控制下,计算机能够自动、成批地处理一个或多个用户的作业(包括程序、数据和命令)。
首先出现的是联机批处理操作系统,即作业的输入输出(Input/Output,I/O)由CPU来处理。批处理是指用户将批量作业流提交给操作系统后就不再干预,由操作系统控制它们自动运行,如图1-2所示。这种采用批处理作业技术的操作系统称为批处理操作系统。批处理操作系统分为单道批处理操作系统和多道批处理操作系统。批处理操作系统不具有交互性,它是人们为了提高CPU的利用率而设计出的一种操作系统。
图1-2 联机批处理操作系统
脱机批处理操作系统是人们为了缓解人机矛盾、主机与外围设备(简称外设)的矛盾,以及提高CPU利用率而设计出的操作系统。这种操作系统的显著特征是:增加一台不与主机直接相连而专门用于与I/O打交道的卫星机,如图1-3所示。
图1-3 脱机批处理操作系统
卫星机的功能是:从输入机读取用户作业并放到输入磁带上,从输出磁带读取执行结果并传给输出机。这样,主机不直接与慢速的I/O打交道,而是与速度相对较快的磁带联系,可有效缓解主机与外设的矛盾。主机与卫星机可并行工作,二者分工明确,也可以充分发挥主机的高速计算能力。脱机批处理操作系统在20世纪60年代应用十分广泛,它极大地缓解了人机矛盾及主机与外设的矛盾,是现代操作系统的原型。1964年,IBM(International Business Machines,国际商业机器)公司发布了System/360(S/360)系统,对应的主机操作系统为OS/360。OS/360支持多道程序,最多可同时运行15道程序。为了便于管理,OS/360把CPU存储器划分为多个(最多15个)分区,每个程序在一个分区中运行。
分时操作系统使得一台计算机可采用时间片轮转的方式,同时为几个、几十个甚至几百个终端用户服务。分时操作系统把计算机与许多终端用户连接起来,将系统处理机时间与内存空间按一定的时间间隔划分为时间片,轮流地切换给各终端用户的程序使用。由于时间间隔很短,每个终端用户会感觉自己独占了计算机。分时操作系统的特点是可有效提高资源的使用率。例如UNIX操作系统就采用剥夺式动态优先的CPU调度,有力地支持分时操作。典型的分时操作系统例子是UNIX和Linux操作系统。其可以同时连接多个终端并且每隔一段时间重新扫描进程、重新分配进程的优先级,还可动态分配系统资源。
计算机操作系统的鼻祖是Multics(Multiplexed Information and Computing System,多路信息和计算系统)操作系统,以下简称M系统。M系统是1964年美国贝尔实验室、麻省理工学院及通用电气公司共同研发的,最初的目的是开发出一套安装在大型主机上多人多工的操作系统。因为当时的计算机一次只能接受一个任务,多人的任务需要排队执行。后来,原M系统设计成员肯尼思·汤普森(Kenneth Thompson)想把一款名为《太空旅游》的游戏移植到他们实验室的一台机器上而开发了一套软件。该套软件参考M系统的思路设计,但是功能单一,实验室的人戏称此软件为UNICS(UNiplexed Information and Computing System,单路信息和计算系统)。由于当时的UNICS每次移植到一个新的机器上时,都需要重复在机器上处理,且需针对不同的机器设备进行额外的编程处理,就是驱动都要程序员写、程序员配,因此那个时候系统的传播受限于硬件和使用者的能力,只能供极少部分人使用。
1971年,肯尼思·汤普森 和丹尼斯·里奇(Dennis Ritchie)为了使当时的UNICS具有更好的移植性、适用于不同的硬件设施,创造了C语言。他们于1973年,用C语言重新改写并编译UNICS的核心,将其正式命名为UNIX,形成了UNIX的初代版本。该版本由于使用了高级语言——C语言,减轻了对底层硬件依赖的问题,从而可以广泛地在各种机器上使用。初代的UNIX采用了200多条程序命令,虽然内核很小,但是功能极为精简、强悍。当时原本需要用100~1000行代码才能实现的程序,在UNIX中使用不超过10条命令就可实现。它极高的效率使它在美国AT&T公司内得以快速传播。可以设想一下,本来要一天才能做完的工作,用当时的UNIX几分钟就能搞定,这种“神器”能不快速传播吗?
计算机软件的发展历程是一个持续优化、提升效率的过程。UNICS的发明是为了将复杂的任务简单化。为了简化软件和硬件的关联处理而重新创建的一种新语言(C语言),也帮助我们实现了软件和硬件的分离,为现代操作系统(UNIX)的发展打下了坚实的基础。需要指出的是,当时的UNIX属于AT&T公司的贝尔实验室,但该公司和学术界院校(美国加利福尼亚大学伯克利分校)合作开发,使得UNIX在各大高校快速传播。1977年,加利福尼亚大学伯克利分校的比尔·乔伊(Bill Joy)在取得了UNIX的核心源码后,着手将其修改成适合自己机器的版本,同时增加了很多功能软件与编译工具,最终将它命名为BSD(Berkeley Software Distribution,伯克利软件套件)。BSD是UNIX很重要的一个分支,苹果公司(后简称苹果)的操作系统实际源自此分支。1979年,AT&T公司出于商业方面的考量,将UNIX的版权收回。因此,AT&T公司在1979年发行的第7版UNIX中,特别提到了 “不可对学生提供源码”的严格限制。这导致后来学术界自力更生,安德鲁·塔嫩鲍姆(Andrew Tanenbaum)教授参照UNIX的功能,写出了Minix系统,用于教授操作系统的相关教程。该系统在1986年完成开发并发布,相关图书也于次年出版。这是后来大名鼎鼎的林纳斯·托瓦兹(Linus Torvalds)得以构建Linux初代系统的基础。
在1984年以前,几乎所有的操作系统都是基于企业或高校科研机构的大型机来设计和使用的,还没有达到普通人能用的地步。当时,大部分的计算机操作系统是基于命令行终端的,没有图形化的操作界面。这样的操作系统只能被极少部分的高级专业人员和学术界的师生使用。但到了1984年,一切都发生了变化。这时,操作系统的发展发生了哪些变化呢?具体如下。
● VisiCorp公司的第一款可视化操作系统Visi On发布。
● 苹果的第一款可视化操作系统macOS 1.0发布。
● 微软公司(后简称微软)推出Windows 1.0(1985年)。
● 日本NEC公司(日本电气股份有限公司)基于ITRON/86规范,第一个实现了ITRON操作系统。
几乎是不约而同的,世界上几个重要的操作系统厂商都在同一时间段内发布了操作系统的商用版本,且都具有图形化界面。而这4个操作系统经过近40年的演进,几乎影响了我们现代生活的方方面面。苹果的macOS实际来源于UNIX(FreeBSD版本),是UNIX阵营向普通消费者市场进军的主力,图形化的界面和应用降低了系统和计算机的使用门槛。
微软之前一直使用MS-DOS命令行的系统,在看到苹果的可视化界面后,紧接着开发出Windows系统,以抢占普通消费者市场,由此开启了苹果和微软两大公司30多年的激烈竞争。
从20世纪80年代中后期开始,大量基于可视化操作界面的操作系统问世后,操作系统真正普及开来。不过,可视化操作系统是直接装在机器上的,它在降低了用户使用门槛的同时,也封闭了内在复杂的软件设计。普通的学院派老师、学生难以看到其被隐藏的具体设计。由此,开源的操作系统Linux出现了。
1991年,在芬兰赫尔辛基上大学的林纳斯·托瓦兹参照UNIX和Minix,重写了一个初始的Linux系统,并于1991年10月5日发布了0.01版。1993年,100余名程序员参与了Linux内核代码的编写、修改工作,其中核心组由5人组成,此时Linux 0.99的代码大约有10万行,用户数大约有10万。由于全世界Linux爱好者、使用者的参与,发展到Linux 4.9.2时,Linux内核源码就超过了1800万行。2019年,Linux新版内核发布,该内核有大约2500万行代码。有别于UNIX的闭源(代码不可获得),Linux系统遵循开源协议,意味着任何人都可以获取和编辑代码,Linux也因此获得了极大的关注和应用推广。