操作系统的发展历程
操作系统的发展历程
操作系统已经发展了许多年,下面我们简要地看一下操纵系统发展历程中的几个里程碑。由于历史上操作系统一直都与计算机体系结构紧密相连。 所以我们可以沿着一系列计算机的发展历程来审视这些操作系统。
第一台真正的数字计算机是由英国数学家Charles Babbage设计的。虽然Babbage倾其一生试图建立一个分析引擎,但是他从来没有让它正常地工作起来,这主要是由于当时的技术并不能制造出这个纯机械的家伙所需的齿轮等器件。很显然,这样一个分析引擎并不拥有一个操作系统。但是Babbage却意识到他需要一些软件来操作这个分析引擎。所以他雇佣了一个名叫Ada Lovelace的女青年。于是这个英国著名诗人Byron爵士的女儿就成为了世界上第一个程序员。程序语言Ada也就是以她的名字命名的。
第一代:阴极射线管和外部指令式计算机
在Babbage不太成功的尝试之后,建造数字电子计算机的工作在第二次世界大战中并没有取得太大的进展。大约在二十世纪四十年代中期,哈佛大学的Howard Aiken,普林斯顿大学的John von Neumann,宾夕法尼亚大学的William Mauchley,德国的Konrad Zuse等人成功的建造了一台计算引擎。这台通过机械传导的机器运行得非常之慢,其时间周期要通过秒来计算。后来,传导的工作改由阴极射线管来完成。即便如此,这些机器还是异常庞大,而且比目前的个人电脑要慢了几百万倍。
早些时候,一组人员负责设计、制造、编程、操作和维护每台机器。当时所有的编程都是用纯粹的机器语言进行的,这些语言都是写在外部指令板上来控制机器的基本功能。那个时候程序语言还没出现,甚至汇编语言也没有,更不要说什么操作系统了。通常的工作模式是程序员预约一段时间,然后进入机房,插入他的指令板,花上几个小时等待跑出结果,而且还得寄希望于那些真空管不要烧掉。所以,当时能解决的问题主要是非常直接的数值计算。
到了二十世纪五十年代早期,上述的步骤有了些许改进,人们用可以打孔的卡取代了外部指令板。
第二代:晶体管和批处理系统
在20世纪五十年代出现的晶体管极大地改变了计算机的面貌。计算机变得更加可靠,它们被制造出来卖给付费用户,这些用户期望计算机能够长期地工作并解决许多问题和工作。这时也是第一次出现了设计者、制造者、操作者、程序员、维护人员的功能分割。
这样的机器,现在被称为大型机(或者“主机”),它们一般放在机房中,有一批专职的工作人员负责运行。只有大型的公司和主要的政府机关和大学才能够负担得起购买这样的大型机。要在这样的大型机上运行程序,程序员首先要在纸上用FORTRAN或者汇编语言写好程序,然后把这些程序以打孔的形式打到卡上。再把这张卡拿到输入室交给操作员,之后就去等待结果跑出来了。
当计算机完成了它当前的工作后,操作员回去打印机那里取出结果送到输出室,方便程序员之后收取。然后操作员再到输入室取一张程序卡,继续让计算机读入。如果程序还需要编译的话,步骤还要更复杂一点。这样,许多时间就在操作员往返于机房的过程中浪费掉了。
由于高昂的开销,人们很快就开始寻找一些方法来减少浪费的时间。通常所采用的方法就是批处理系统。这当中的思想就是在输入端将一堆完整的任务通过一台相对较小而且较为便宜的计算机(诸如IBM1401,这种机器在读卡、复制磁带、打印输出上性能出色,但并不擅长数值计算)读到磁带上,用相对昂贵的机器(诸如:IBM7094)读取磁带来进行实际的计算。
任务的计算输出被写到另一盘磁带上,当一个任务完成后,操作系统自动从磁带上读取下一个任务并运行。当整个一批任务运行完后,操作员取下输入输出的磁带,换上新的磁带,再把取下的输出磁带放到诸如1401这样的小型机上进行“离线”打印。
大型的第二代计算机广泛应用于科学和工程计算。程序多以FORTRAN或者汇编语言编写。典型的操作系统为FMS(the Fortran Monitor System)和IBSYS(IBM为7094所设计的操作系统)。
这里可以说已经有了初始的操作系统。
第三代:集成电路和多程序系统
在二十世纪六十年代初之前,大多数的计算机制造商都有着两条完全不同的生产线。一条用来制造以字(word)为单位的大规模的科学计算机,诸如7094之类。另一条则是用来制造以字符(character)为单位的商业计算机,诸如1401。
开发和维护两条完全不同的生产线对制造商来说是非常昂贵的。而且许多新的计算机用户一开始只想要一台小型机器,然后当这台机器过时的时候再买一台稍微大一点、快一点的机器来运行原来的程序。
IBM试图通过引入Sysetm360来解决这两个问题。360是于一系列软件上相互兼容但规模上却千差万别的机器,仅在价格和性能上有所差别。由于这些机器有着相同的体系结构和指令集,为一种机器所写的程序可以在其它机器上运行。更进一步,360被设计成同时拥有科技运算和商业运算的能力。这样,一族机器就能满足所有客户的需求。在之后的几十年内,IBM采用了更多的现代技术,开发出了更多与360相兼容的后继机型,比如370,4300,3080和3090系列。
360是第一条采用集成电路技术的计算机主线,展现了相比其第二代计算机更出色的价格和性能优势,立即取得了成功。这种兼容机的思想迅速被其它主要的制造商采用。这些机器的后代仍然在当今的计算中心中运行着。
“兼容机”思想的最大的优点同时也是它最大的缺点。这主要是因为包括操作系统OS/360在内的所有软件都必须得在所有的机型上运行。它必须得在不同的使用环境下都表现得很有效。
IBM没有办法写出这样一款软件来满足这些冲突的要求。所导致的结果是一个巨大的而且极度复杂的操作系统,这个系统要比FMS大了两到三个数量级。它由数百万条汇编语言组成,也包含了上千个bug,更糟糕的是,每修复一个bug,又会引入新的bug。
实际上,除了庞大的体积和颇多的问题,OS/360和由其它制造商生产的第三代操作系统已经能够满足大多数用户的需求。它们普及了几项在第二代操作系统中所没有的技术,这其中最重要的一项应该是多程序的设计了。在7094上,当前任务由于等待磁带或者I/O操作而暂停的时候,CPU仅是空闲在那里等待I/O操作结束。当处理科学计算时,I/O操作并不频繁,所以这点时间的浪费并不显得十分重要,而商业数据处理时,I/O操作的时间占据了总时间的80%-90%,必须想出一些办法来避免CPU长期处于空闲状态。
解决方法之一是把内存分割成片,每一个任务获得一部分。当一个任务正在等待I/O完成时,另一个任务可以使用CPU。如果内存中可以同时容纳足够的任务,CPU能够保持100%的利用率。在内存中同时安全地运行多个任务要求专门的硬件保护,360和其它第三代系统中都装配了这种硬件。
第三代操作系统中另一个重要特征是能够在卡片刚送到机房时就马上把任务读到硬盘上。这样,不管正在运行的任务是否完成,操作系统都能够把新任务装载到一个空的内存分片中去,并运行它。这种技术称之为spooling(Simultaneous Peripheral Operation On Line),这种技术也用在输出上。由于spooling技术的出现,1401不再需要了,作为传媒的磁带也消失了。
尽管第三代操作系统非常适合大型的科学计算和大量的商业数据处理,但是它们从根本上说仍然是批处理系统。在第三代系统中,提交任务和获取输出之间的时间通常要几个小时,所以仅仅一个逗号的错误就会造成编译失败,浪费了程序员大量的调试时间。
对快速反应的需求为分时技术的发展铺平了道路。分时技术是多程序技术的一种变体,通过它,每个用户都能有一个在线的终端。因为人们在调试程序时通常会发出一些短的指令,所以计算机能够向一些用户提供快速的、交互的服务。而在大型机的批处理系统下,CPU这时候可能就要空闲了。第一个正式的分时系统CTTS(Compatible Time Sharing System)是由MIT在一台修改过的7094上开发出来的。然而,分时技术直到必要的硬件保护在第三代中广泛应用后才变得流行起来。
在CTSS系统成功之后,MIT和贝尔实验室,通用电气等决定着手开发一个共用计算机实体,一台可以同时支持上百个分时用户的机器。这个设计,也就是传说中的MULTICS(MULTiplexed Information and Computing Service),构想了一台能够同时提供波士顿地区所有人足够计算能力的巨型机器。
MULTICS可谓毁誉参半。它被设计成一台能支持数百用户工作的机器。这台机器只有略多于一台基于Intel 386的个人电脑的能耗,却有着更多的I/O能力。有很多原因可以解释为什么MULTICS没有占据世界,其中之一就是因为它是通过PL/I编写的,而PL/I编译器则是几年后的事情了,而当它真正出现的时候这种语言已经不怎么使用了。MULTICS在当时绝对是雄心壮志,在这点上特别想当年Charles Babbage的分析机一样。
MULTICS为计算机文化引入了许多启迪式的思想,但是把它们变成一个正式的产品和巨大的商业成功去并不是件容易的事情。贝尔实验室放弃了这个项目,与其一同退出的还有GE。然而MIT坚持了下来,并最终使得MULTICS能够真正跑起来。MULTICS后来被买下GE计算机业务的Honeywell作为商业产品卖出,并安装到了80个世界上主要的公司和大学里。尽管这个数目很小,但是MULTICS的用户都很忠诚。GM,福特,和美国国安局等等直到二十世纪九十年代才关闭了它们的MULTICS。
第三代计算机的另一个重要的发展就是小型机的大量增长。DEC公司先后开发出了一些列的PDP小型机。其中的PDP-1大概只要IBM7094价格的5%。
抛开商业上的失败,MULTICS对后世的操作系统还是产生了巨大的影响。一个曾经在MULTICS项目中工作过的贝尔实验室的科学家Ken Thompson,找到了一台没人用的PDP-7小型机,便开始着手写一个删减版的单用户的MUTLICS。这项工作后来逐渐发展成了举世闻名的UNIX操作系统。
UNIX是一个开源的操作系统,由于它公开了源代码,许多组织都开发了属于自己的版本,引起了一定的混乱。目前两个主要的版本非别是由AT&T开发的System V和有UCB开发的BSD(Berkeley Software Distribution)。它们都有着少量的变化。为了能使所写的程序能够在所有的UNIX系统上运行。IEEE为UNIX开发了一套标准,称之为POSIX,目前大多数的UNIX版本都支持这个标准。事实上,一些其它的操作系统也支持POSIX接口。
此外,值得一提的是在1987年,Tanebaum教授出于教学的考虑,发布了一个小型的克隆版UNIX,称为MINIX。功能上讲,MINIX与UNIX非常相似,也支持POSIX标准。而出于构建一个免费的产品级的MINX的想法促使一名芬兰学生Linus Torvalds写出了Linux。这个系统是在MINIX上开发出来的,支持MINIX的各种功能。这些年来,Linux一直在被扩展,但是其大量的底层结构依然与MINIX有很多共同之处。
第四代:个人电脑
随着大规模集成电路的发展,芯片所包含的晶体管越来越多,个人电脑的时代到来了。在结构上,个人电脑(又称微机)与PDP-11之类的小型机们并没有太大的不同。在那些可以拥有小型机的公司部门和大学里,微处理芯片也使得个人拥有计算机也成为可能。在1974年,当Intel推出了第一款通用处理器8080时,需要一个支持8080的操作系统用来测试它。Intel请它的顾问之一的Gary Kildall写一个。Kildall和一个朋友第一次为新发布的Shugart Associates 8英寸软盘写了一个控制器,并把这个软盘挂载到8080上,这样就产生了第一台具有硬盘的微机。然后Kidall为其写了一个基于硬盘的操作系统CP/M(Control Program for Microcomputers)。因为Intel并不认为基于硬盘的微机有太大的前途,所以当Kildall要求CP/M的版权时,Intel很爽快地答应了。Kildall之后组建了一个公司Digital Research来进一步开发和销售CP/M.
在1977年,Digital Research重写了CP/M,使得它能够更好的在许多处理器芯片上运行。很多应用程序都是基于CP/M的,使得CP/M完全统治了当时的微机世界有大概5年的时间。
在二十世纪80年代早期,IBM设计了IBM PC并寻找能够在上面运行的软件。IBM的人联系Bill Gates购买他的BASIC解析器的许可证。他们还咨询他有没有能够在PC机上运行的操作系统。Gates建议IBM联系Digital Research,当时最大的操作系统公司。Kildall可能做出了历史上最糟糕的商业决定,他竟然拒绝同IBM会晤,而只派了一个下属去。刚糟的是,他的律师拒绝同IBM签订一份尚未公开的关于还没公布的PC的协议。后来IBM只好回头去找Gates,问他是否能为他们提供一个操作系统。
当IBM回头之后,Gates发现一个当地电脑制造商Seattle Computer Products,有一个合适的操作系统,DOS(Disk Operating System)。他接洽了它们,并询问买下这个操作系统的可能性(据说是50000美元),后来Seattle Computer Products同意了。Gates之后提供给了IBM一个DOS/BASIC包。IBM想进行一定的修改,于是Gates雇佣了编写DOS的人,Tim Paterson,作为Gates羽翼未丰的公司Microsoft的一员,来编写DOS。修改后的系统称为MS-DOS(MicroSoft Disk Operating System),并迅速统治了IBM PC机市场。一个关键的因素在于Gates决定将MS-DOS卖给计算机公司来与他们的硬件相绑定,这与Kildall将CP/M卖给终端用户的尝试大相径庭,至少在一开始是这样的。
随着配有Intel 80286 CPU的IBM PC/AT的推出,MS-DOS牢牢占据了市场,而CP/M则越来越没有竞争力。一开始MS-DOS是很土的,后来的版本逐渐融入了许多高级的功能,包括许多从UNIX处学来的东西。
CP/M、MS-DOS以及其它早期的微机操作系统都是基于命令行的。这一点最终由斯坦福研究中心的Doug Engelbart所作的研究工作所改变。Engelbart发明了GUI(Graphical User Interface)技术,称为“gooey”,全部由窗口、图标、菜单和鼠标组成。这些思想后来又被Xerox PARC的研究人员采用,并集成到他们研制的机器中去。
一天,Steve Jobs访问了PARC,看到了GUI,马上意识到它的潜在价值,这些正是Xerox管理层所忽视的。Jobs之后便开始着手拥有GUI的Apple机。这个项目的成果是Lisa,但是由于太贵了,所以在商业上失败了。Jobs的第二次尝试,Apple Macintosh,则取得了极大的成功,不仅因为它比Lisa更便宜,也因为它更友好的用户界面,意味着它就是为那些对计算机一无所知并且也什么也不想学的人设计的。
当Microsoft决定设计MS-DOS的后继产品时,受到了Macintosh成功的极大影响。他们创建了基于GUI的系统——Windows,这个系统一开始是运行在MS-DOS上的。在1985-1995的十年间,Windows都只不过是一个运行在MS-DOS之上的一个图形环境。然而,从1995年起,一个独立版本的Windows,Windows 95发布了,这个版本集成了许多操作系统的功能,仅在启动以及运行老的MS-DOS程序时使用MS-DOS系统。1998年,一个稍作修改的版本Windows 98发布了。然而,不管是Window 95还是Windows 98都包含了大量的16位Intel汇编语言。
另一个Microsoft的操作系统是Windows NT(NT是New Technology的缩写),它与Windows 95在某种程度上兼容,但是内核是完完全全重写过了的。它是一个完整的32位系统。Windows NT的首席设计师David Culter,也是VAX VMS操作系统的设计人员之一,所以一些VMS的一些思想也在NT上得到了展现。Microsoft本来期望NT的最初版本能够取代MS-DOS以及其它的Windows版本,因为它是一个更为高级系统,但却失败了。直到Windows NT 4.0才在这一点上取得了巨大的进步,特别是集成了网络的功能。1999年初,Windows NT 5.0被重新命名为Windows 2000。它被作为Windows 98和Windows NT 4.0的后继者。但是效果并不好,所以Microsoft又推出了Windows 98的另一个版本Windows Me(Millennium edition)。
个人电脑领域另一个主要的竞争者就是UNIX。UNIX在工作站及高端计算机上的表现是最好的。它在采用高性能RISC芯片的机器上格外流行。在采用Pentium的计算机上,Linux逐渐成为了一个对学生而言十分流行的Windows替代品,并且拥有了越来越多的用户。
尽管许多UNIX用户,特别是有经验的程序员,更喜欢使用命令行的接口,而不大喜欢使用GUI。几乎所有的UNIX系统都支持了一种由MIT开发的称为X Windows的窗口系统。这种系统处理了基本的窗口管理,允许用户通过鼠标创建,删除,移动,调整窗口。通常一个完整的GUI,像Motif,都可以在X Windows上运行。
在八十年代中期开始,运行网络操作系统以及分布式操作系统的个人电脑网络成为了一项非常热门的开发。在网络的操作系统上,用户知道还有大量计算机存在,并且可以登录到远程的机器上去,还可以把一台机器上的文件复制到另一台机器上去。每台机器都运行一个本地操作系统,也有着自己的本地用户。
网络操作系统与单处理器操作系统从根本上讲并没有太大的不同。显然,他们需要一个网络接口控制器以及一些底层软件来驱动它,还需要一些程序用来实现远程登陆和远程文件获取,但是这些附件并没有改变操作系统的基本结构。
分布式操作系统则恰恰相反。从用户来看,他就像一个传统的单处理器系统,尽管实际上它是由多个处理器组成的。用户应当感觉不到他们的程序在哪里运行、他们的文件存放在哪里,而这些都是由操作系统自动而有效地完成的。
真正的分布式操作系统要比单处理器操作系统多出很多代码,因为分布式和集中式系统有着根本的区别。比方说,分布式系统允许应用程序同时在几个处理器上运行,这样就需要更为复杂的处理器调度算法来优化并行性能。
网络中通信延时通常意味着这些算法必然无法运行完全,也有可能超时,甚至带来错误信息。这种情况与完全知道系统所有信息的单处理器操作系统相比是截然不同的。
在Charles Darwin的《物种起源》出版后,德国动物学家Ernst Haechel便提出了“进化重演”的理论。他指出每个个体的生长都重复着其种族的演化历程。类似的现象在计算机产业中也存在着。每一个新的物种(大型机,小型机,个人电脑,嵌入式计算机,卡片机等)似乎都经历了他们祖先的发展历程。最早的大型机是完全用汇编语言编写的。甚至复杂的程序,像编译器和操作系统都是拿汇编语言写的。小型机出现时,FORTRAN,COBOL和其他高级语言都和大型机上的一样,但是小型机仍然是用汇编程序编写的。当微机发明的时候,他们还是用汇编程序编写的,尽管那时小型机都已经用高级语言编写了。掌上电脑也是从汇编语言开始的,但是迅速转换到了高层语言上。对于卡片机也是如此。
现在让我们在回顾一下操作系统。最初的大型机并没有硬件保护,也不支持多程序技术,所以它们运行的操作系统只能一次一个地处理手动装载的程序。立后来它们具备了硬件保护能力,操作及同就可以同时支持多程序技术了,之后也就具备了分时处理的能力。
当小型机刚出现的时候,即使多程序技术在当时的大型机上已经非常成熟,它们也没有硬件保护,还是只能一次一个地运行手动装载的程序。后来他们也具备了硬件保护能力,也就能同时跑两个以上的程序了。微机、掌上电脑、卡片机都是如此。
硬盘最早出现在大型机上,然后又先后出现在小型机、微机等等上。即便现在,卡片机上还没有硬盘,但是随着flash ROM技术的进步,它们很快也会配备上硬盘了。等硬盘刚出现的时候,原始的文件系统就开始发展了。早期小型机的文件系统拥有单一的文件目录,这个目录为所有用户所共享,早期微机的文件系统也是这样子的。
虚拟内存技术也有相似的发展历程。它最早出现在大型机上,之后依次是小型机、微机,再到更小的系统上。与此类似的还有网络。
软件的发展历程是由技术来指引的。最初的微机可能只有4KB的内存,没有硬件保护。高级语言和多程序技术对这样一个小型系统来说显然有些不堪重负。随着微机逐渐演化成个人电脑,他们拥有了必要的软硬件来运行更多高级的功能。这样的发展可能还会在未来的日子里继续。其他领域也会重复历史的车轮,只不过在计算机领域,这个轮子滚得更快一点罢了。