前世今生 ―― 操作系统的来龙去脉
这篇文章里,我们将和您探讨什么是操作系统,以及操作系统的历史和功能,并从发展的角度向您展示操作系统怎样在用户需求地推动下一步步发展到今天的规模。了解这些,可以方便我们今后更深入理解操作系统。
迷失的世界 ―― 操作系统直观定义
虽然定义总是生硬、乏味、令人费解,但是它毕竟是概括性最强的,一言以蔽之,我们给操作系统的定义是:操作系统是应用程序的运行环境。
可能运行环境这个术语令你如坠云端,它太广泛、太抽象了。其实,你可以把运行环境看作是一种集服务和控制于一体的容器。
如果你没有理解环境这个概念,我可以举个例子,用在这里可能并不贴切,但能说明一些问题:
现在遍布各地的软件开发区里,你可以看到许多企业孵化池或产业园,其间各种企业星罗棋布。产业园的管理机构往往为企业集中办理各种工商、保险、卫生医疗等手续、提供后勤、治安等基础服务,企业需要某些政务服务时,可以通过管理机构去和政府联系,进行处理,而不需要自己去完成这些纷繁复杂的工作。这样,他们就可以抽出身来,集中精力在业务上。产业园集中管理了社会各方面的资源,为企业提供了统一、普遍的服务,是企业运作的外在环境。操作系统从某种意义上来说,类似于产业园的管理结构,为应用程序――好比企业――提供基础服务和管理好资源。
那么,运行环境怎么管理资源?提供的服务是什么?我们怎么才能利用这些服务呢?这一系列的新问题肯定又接踵而至了。别着急,take it easy,我们的杂志就是为了和大家探讨这些问题,分享相关经验。但是,罗马不是一天建成的,希望我们一步一步前进,最终能够搞清楚来龙去脉。
走向未来 ―― 了解操作系统历史
列宁说过:“掌握历史的人掌握未来”。政治如此,技术概不例外。像操作系统这样一种大型软件,往往经历了长久的开发和演变,不了解历史渊源就去了解设计和实现,很容易就让新的学习者走上迷途――设计抉择往往要根据当时的背景(主要是技术背景)决定,保留下来的只是软件和代码,没有一丁点历史的线索,仅从这里去探幽揭秘,恐怕会一去不返。
对于操作系统所采用的某种技术,或者确切地说某种设计选择,我们必须了解它的产生原因和发展过程,才能较为全面地认识它所解决的问题,认识它在学科发展中所处的地位。对比技术发展各个阶段的特点,才能认清该技术的优劣。同样,我们想要把握操作系统的特性,还是先把操作系统放在时间轴上看看它的来龙去脉吧!
计算机和操作系统并不是结伴来到这个世界的。最初的计算机科学中并不存在操作系统这个概念,所有任务都直接运行于硬件之上。那时的任务大多集中于科学计算领域,系统硬件实现相对简单、直接,任务对I/O操作的要求也比较低,将结果记录到磁带机之类的简单设备中足矣。老程序员们大多采用手工或是用打孔机的方式将二进制数据和程序输入机器内存,然后执行计算,最后,将结果保存到磁带机上。一旦出现错误,机器上的调试灯会将保存在寄存器中的错误代码反映出来,程序员们会据此去分析错误所在。
随着需要执行的任务变得越来越复杂,计算机逐渐被应用到了科学计算以外的其它领域。硬件设备比以前更加丰富和复杂了,I/O操作要求大幅提高,程序规模迅速扩大,调试时出现的错误更是直线上升,直接操作硬件,对程序员来说越来越举步维艰。
高级语言、编译系统应运而生了,它们可以帮助程序员简化开发工作;操作系统也闪亮登场了,它可以帮助程序员管理和操作硬件设备,让程序员们可以将精力集中于开发使用的功能本身,而烦琐的任务,如任务装载、分配/释放内存、内存寻址、设备驱动、数据存储等等硬件相关操作,统统被交给操作系统管理――对于软件行业,这绝对是生产力的一次革命性的解放。
时代继续发展,多用户多任务时代的来临,使得系统管理更加强调资源共享性。用户直接操作系统资源显然有悖上述精神,因此资源合理分配与保护更为操作系统发展提供了新的挑战和机遇,同时奠定了操作系统不可或缺的地位。从此,操作系统成为软件体系中最基础、最重要的组成部分了。
百炼成金―― 操作系统的演化
“流水不腐,户枢不蠹”,操作系统也是在不断演化发展中达到今天的水平。经历了半个多世纪的发展,迄今为止,操作系统已经形成了一个庞大的家族。从个人计算机到工作站,从通用系统到专用系统,从嵌入式到虚拟机,各种操作系统形式丰富多样。我们很难将所有操作系统囊括,只希望提纲挈领地介绍在操作系统发展进程中具有代表性的几种系统,理清它的演化脉络。
最早的操作系统是单道批处理系统。现在看起来,它的功能相当简陋,只能串行执行预先组织好的任务组。早期的系统一次只能运行一个任务,每个任务必须先装入,再等执行完后才能装入下一个任务,重复的装入浪费了大量的时间。单道批处理系统的出现,大大提高了系统吞吐率。
事情并非总如想象般顺利。
由于数据存储时所消耗的时间(I/O操作时间)相比数据处理时间(CPU操作时间)不在一个数量级上(往往高出20倍以上),所以程序在执行I/O操作期间,CPU总是需要停下来(挂起)等待数据传输完成,任务组中后续程序此时无法执行,因此浪费了大量宝贵的处理器时间。如何避免数据传输等待带来的浪费呢?能否在进行I/O传输期间,解放CPU,让它去执行正焦急等待的其它任务呢?
在克服这个瓶颈的过程中,单道批处理系统逐渐演化到了多道批处理系统。
所谓多道实际就是说处理器(目前你可以理解为单处理器)可以交错执行多个任务,在某个任务挂起时,执行另一个任务。这样一来, CPU等待数据传输造成的时间浪费问题得以解决,系统吞吐率又一次得到了提高。
技术的发展使得计算机的作用不再仅仅局限于科学计算,它越来越多地应用于办公、生产和生活中。科学计算中的任务多数执行路径都是固定不变、可以是预先定义好的。给定输入后,在计算结果的过程中,程序执行不需要外界干预;办公,生产和生活对计算机的要求截然不同,许多任务都必须和用户不断交互,任务结果随时都会因为用户的选择而改变。这时的系统变得更公开、更通用,往往允许多个用户可以同时使用。交互模式和共用模式需要任务响应时间尽可能的短(超过20秒的话,人的思维就容易被打断或变得很不耐烦),这样才能让每个用户都满意。于是操作系统开始采用分时技术,处理器的运行时间分成数片,均分或依照一定权重派发给系统中的用户使用。这种将处理器虚拟分派给多用户共同使用的方法,不但可以满足快速响应的要求,而且也可以使所有用户产生计算机完全是在为自己服务的假象。这就是分时系统,我们现在用的主流系统,基本上都是分时系统。
上面就是操作系统发展路线图:单道批处理――多道批处理――分时系统。另外,现在还出现了许多其它操作系统,如分布式系统,嵌入式系统等等,它们的总体技术思路都仍然脱离不了多道、分时等概念。
千钧重负 ―― 操作系统的任务
从操作系统的起源同样可以看出,操作系统的核心任务是管理资源 (硬件设备本身)和提供服务(利用硬件设备,当然,还有一些软件功能)。它是硬件和应用程序之间的一个中间层,或者说是应用程序的操作平台。应用程序和系统硬件被隔离开,应用程序通过操作系统提供的服务完成硬件设备相关操作。硬件设备通过操作系统向应用程序提供“光”和“热”。
从系统用户的角度讲,操作系统带来了如下几方面的好处:
易于操作
操作系统是用户和计算机之间的接口,它大大简化了用户执行任务时的复杂度。
作为应用程序的执行环境,它为程序员建立应用程序提供了必要的编辑工具、编译环境和调试工具;为程序的执行提供了载入服务和资源分配服务;为数据存取提供了I/O访问服务;为数据格式转化和定位提供了文件操作服务;为程序的安全运行提供了权限控制服务;为程序运行失败提供了错误报告服务等等系统服务。从此,程序员和用户都不再需要关心那些令人生畏的计算机体系结构细节,可以神清气爽地开发应用程序了。
保证效率
从另一个角度看,可以将操作系统当成一个计算机资源管理系统。
由于系统中资源种类各异,用法也大不相同,如果直接由用户管理这些资源,比如内存分配,时钟计时,I/O驱动,存储维护,势必要求用户具有丰富的软硬件知识,深刻把握计算机系统结构,否则资源将难以合理使用,最终造成系统混乱,甚至崩溃。而且现代的多用户操作系统更是要求系统资源共享,资源必须合理分配给多用户、多任务,只有采用一定的调度策略和分配策略,才能保证资源被公平有效地利用。所以,配置资源成了提高性能的关键――如同资源配置是提高生产力的关键一样。
安全可靠
安全性是操作系统为我们提供的另一个重要特点,它为我们提供了多层面的安全保障。
首先,操作系统作为系统硬件和用户的中间平台,可以禁止应用程序直接操作硬件;禁止应用程序直接访问内存、执行特权指令。多数系统都将应用程序运行限制在用户空间(低特权级),而操作系统则运行于内核空间(高特权级),应用程序只有通过特定的接口(系统调用)来请求操作系统所提供的服务,进而通过操作系统间接执行和硬件相关的操作或是执行特权指令,由此保护了系统不被恶意的应用程序或不恰当的操作破坏。
其次,多任务、多用户操作系统保证不同任务之间信息不能泄漏。一般需要为任务划分各自的私有空间和对其进行访问控制。对不同用户进行相应的授权和认证,可以保证用户划河为界,互不侵犯。
总之,操作系统安全涉及方方面面,健壮的操作系统能够多方位地保证任务安全执行。
容易扩展
计算机技术正以前所未有的高速度持续发展,计算机硬件设备不断推陈出新。这要求操作系统提供足够的支持,有效地将可能应用的硬件资源纳入管辖范围,给用户提供更好的服务。所以,操作系统应该具有良好的扩展性。
操作系统一般会对系统资源和服务进行抽象,屏蔽底层细节,统一上层接口。通过这些措施,使添加设备或服务变得更容易。对于一种新的设备进行支持,一般需要做的仅仅是按照设备或服务规定的接口提供驱动程序或方法就可以了。
什么是资源?
资源概念在操作系统中使用得相当广泛,内存、磁盘、文件、处理器、时钟等等软硬件都可以划归到资源范畴。概括来讲,系统中的资源指的是系统提供给进程使用的特殊实体,应用程序通过向操作系统请求获得这些实体。另外,系统分配这些实体给应用程序前,进程需要挂起它的操作。凡是满足上述条件的实体就属于资源。
文章写到这里,我们对操作系统的一些基本认识就写完了,这主要是一些基本观念的澄清和历史背景的介绍。希望读者能对操作系统有个感性(最好是“感兴(趣)”)的认识,我们会在本期的其它文章中继续和您探讨其他相关的话题。