统的概念 虽然定义总是生硬、乏味、令人费解,但是它毕竟是概括性最强、最能体现水平的,所以我们还是要在开始就给出操作系统定义: 操作系统是应用程序的运行环境。 够精辟吧! 可能运行环境这个术语令你如坠云端,它太广泛、太抽象了。你一定在问运行环境到底是什么?简单地讲,运行环境是一种即服务和控制于一体地容器。 如果你没有理解环境这个概念,我可以举个并不贴切的社会实例。 在开发区中可以看到许多企业孵化池或产业园,其中入住了各种各样的企业,孵化池或产业园的管理机构会统一为其中的企业办理各种工商、保险、卫生医疗等手续、提供后勤、治安等基础服务,企业需要某些政务服务时,可以通过管理机构去和政府联系,处理相关事宜,而不需要亲自去处理这些和企业业务无关的政务活动,因此可以抽出身来集中精力在业务上。孵化池和产业园为企业提供了统一、普遍地服务和管理,是企业运作的外在环境。操作系统从这个意义上来说,类似于产业园的管理结构,为应用程序——好比企业——提供基础服务和管理。 当然,我们现在并不指望你立刻认识到操作系统深刻内涵,对它的认识需要在不断地使用和思考中消化和积累,在本期杂志中,我们将从各种角度介绍“运行环境”这个术语的真实含义,并在今后各期杂志中分阶段、分层次的展开学习操作系统的各个领域。相信在不久的将来,你就能和我们一起认清它的庐山真面目了。操作系统产生背景 想要认清一个人,最好是从小认识他。对技术的理解也是如此,我们必须了解它的产生原因和发展过程,才能较为全面的认识该技术所解决的问题,认识它在学科发展中所处的地位。对比技术发展各个阶段的特点,才能认清该技术的优劣。同样,我们想要把握操作系统的特性,还是先把操作系统放在时间轴上看看它的来龙去脉吧! 操作系统并不是计算机出现之初就有的,最初的计算机科学中并不存在操作系统这个概念,所有任务都直接运行于硬件之上。那时的任务大多集中于科学计算领域,系统硬件实现相对简单、直接,任务对i/o操作的要求也比较低,将结果记录到磁带机之类的简单设备中足矣。老程序员们大多采用手工或是用打孔机的方式将将二进制数据和程序输入机器内存,然后执行计算,最后,将结果保存到磁带机上。一旦出现错误,机器上的调试灯会将保存在寄存器中的错误代码反映出来,程序员们会据此去分析错误所在。 随着科学计算任务变得越来越复杂,计算机逐渐被应用到了科学计算以外的其它领域。硬件设备比以前更加丰富和复杂了,i/o操作要求大幅提高,程序规模迅速扩大,需要调试的错误更是直线上升,直接操作硬件,对程序员来说变得越发困难。 于是出现了高级语言、编译系统,帮助程序员简化开发工作;出现了操作系统,帮助程序员管理和操作硬件设备。程序员们可以将精力集中于开发需要的任务,烦琐的如任务装载、分配/释放内存、内存寻址、设备驱动、数据存储等等硬件相关操作统统交给操作系统管理——真可以说是生产力的一次解放。 时代继续发展,多用户多任务时代的来临,使得系统管理更加强调资源共享性。用户直接操作系统资源显然有悖于上述精神,因此资源合理分配与保护更为操作系统发展提供了新的挑战和机遇,同时奠定了操作系统不可或缺的地位,从此,操作系统成为为软件体系中最基础,最重要的组成部分了。操作系统的任务从操作系统的起源可以看出,操作系统的核心任务是作为硬件和应用程序之间的一个中间层,或者说是应用程序的一个操作平台,通过它应用程序和系统硬件隔离开,应用程序利用它提供的服务完成硬件相关操作。 总而言之,操作系统方便了应用程序运行,保护了系统资源。具体地讲,操作系统为用户带来了几个方面的好处:易操作性: 操作系统是用户和计算机之间的接口,它大大简化了用户执行任务的复杂程度。 作为应用程序的执行环境:它为程序员建立应用程序提供了必要的编辑环境、编译环境和调试工具;为程序的执行提供了载入服务和资源分配服务;为数据存取提供了i/o访问服务;为数据格式转化和定位提供了文件操作服务;为程序的安全运行提供了权限控制服务;为程序运行失败提供了错误报告服务等等系统服务,从此,程序员和用户都不再需要关心那些令人生畏的计算机体系结构细节,可以全心全意地开发应用程序了。 有效性:从另一个角度看待操作系统,可以将它认为是一个计算机资源管理系统。 由于系统中资源种类各异,用法也大不相同,如果直接由用户管理这些资源,比如内存分配,时钟计时,i/o驱动,存储维护,势必要求用户具有丰富的软硬件知识,深刻把握计算机系统结构,否则资源将难以合理使用,最终造成系统混乱,甚至崩溃。而且现代的多用户操作系统更是要求系统资源共享,资源必须合理分配给多用户、多任务,只有采用一定的调度策略和分配策略,才能保证资源被公平有效的利用。所以,配置资源成了提高性能的关键——如同资源配置是提高生产力的关键一样。 安全性:安全性是操作系统为我们提供的另一个重要的特点,它为我们提供了多层面的安全保障。 首先,操作系统作为系统硬件和用户的中间平台,禁止应用程序直接操作硬件,禁止应用程序直接访问内存,执行特权指令。多数系统都将应用程序运行限制在用户空间(低特权级),而操作系统则运行于内核空间(高特权级),应用程序只有通过系统调用请求操作系统所提供的接口,才能通过操作系统间接执行和硬件相关的操作或是执行特权指令。因此保护了系统不被恶意的应用程序破坏或非法操作。 其次,多任务多用户操作系统必须保证,不同任务之间信息不能泄漏,因此需要为任务划分各自的私有空间和对其进行访问控制。对不同用户进行相应的授权和认证,可以保护用户各行其是,互不侵犯。 总之,操作系统安全涉及方方面面,健壮的操作系统必须能多方位地保证任务安全执行。 易扩展:计算机技术的高速发展和计算机日益普及,计算机硬件设备不断推陈出新,这要求操作系统提供的服务也能够日新月异,因此要求操作系统具有良好的扩展性。 由于操作系统对系统资源和服务进行了抽象,屏蔽了底层细节,统一了上层接口,添加设备或服务成了一件轻而易举的事,需要做的仅仅是,在设备或服务规定的接口下完成新的实现即刻。 什么是资源? 资源概念在操作系统中使用得相当广泛,内存、磁盘、文件、处理器、时钟等等软硬件都可以划归到资源范畴。资源的概念其实很好理解,概括来讲,系统中的资源指的是系统提供给进程使用的特殊实体,进程通过向操作系统请求获得这些实体,另外,系统分配这些实体给进程前,进程需要挂起等待。凡是满足上述条件的实体就属于资源。操作系统的演化和其它任何事务一样,操作系统并非一成不变。迄今为止,它已经经历了半个多世纪的发展,已经形成了一个庞大的家族。从个人计算机到工作站,从通用系统到专用系统,从嵌入式到虚拟机,可谓形式丰富多样。我们难以将所有操作系统囊括,只希望提纲挈领地介绍在操作系统发展进程中具有代表性的几种系统,理清它的演化脉络。 进化历程 : 最早的操作系统是简单的单道批处理系统。它的功能相当简陋,只能串行执行预先组织好的任务组。早先的系统一次只能运行一个任务,每个任务必须先装入,再等执行完后才能装入下一个任务,重复的装入浪费了大量的时间。单道批处理系统的出现,大大的提高了系统吞吐率。 事情并非总如想象般顺利。 由于数据存储时所消耗的时间——i/o操作时间——相比数据处理时间——cpu操作时间——要高出数倍(往往在20倍以上),所以程序运行到i/o操作期间,cpu总是需要停下来(挂起)等待数据传输完成,无形中浪费了大量宝贵的时间,任务组中后续程序的执行也因此被延迟了。如何避免数据传输等待带来的时间浪费呢?能否在进行传输期间,解放cpu去执行别的任务呢? 为解决这个瓶颈,单道批处理系统进化到了多道批处理系统。 所谓多道就实际就是说,处理器(当然现在谈到的都属于单处理器系统)可以交错运行多个程序,某个任务挂起时,运行另一个程序。这样一来, cpu等待数据传输造成的时间浪费问题得以解决,系统吞吐率又一次得到了提高。 计算机的发展使得任务不再仅仅局限于科学计算,越来越多的应用于办公、生活等日常活动中。科学计算中的任务多数执行路径都是固定不变,预先定义好的,只需要给定输入,得到结果期间程序执行中途不需要外界干预,与之不同,办公,生活中的许多任务都必须和用户不断交互,任务结果随时都会因为用户的选择改变。这时的系统变得更公开、更普遍,往往允许多个用户可以同时使用。交互模式和共用模式需要任务响应时间尽可能的快(超过20秒的话,人的思维就容易被打断或变得很不耐烦),这样才能让多个用户都满意,于是操作系统开始采用分时技术,处理器的运行时间分成数片,均分或依照一定权重派发给系统中的用户使用。这种将处理器虚拟给多用户共同使用的方法,不但可以满足快速响应,而且也可以使得所有用户获得计算机完全是在为自己服务的假象。 上面给出了操作系统发展的主流路线:单道批处理——多道批处理——分时系统,除此以外现在还出现了许多分布式操作系统,嵌入系统,不过总体技术思路都仍然脱离不了多道、分时等概念。操作系统内容 操作系统的演化使得其功能变得愈来愈强大,但结构也越来越复杂。在以方便用户(包括开发人员和终端用户)为宗旨的思想下,操作系统不断集成新功能,新服务。回忆从前大家使用的dos系统仅仅只需要一张软盘,而如今的windows系统或linux系统动辄就需要数张光盘,可见已经从过去的麻雀变成了恐龙——虽然它们都有五脏六腑。 虽然变成了恐龙,但是其结构还时相对稳定,清晰的。和软件工程提出的思想一致,操作系统也采取了分层结构,越向上层抽象都越高,越接近用户;相反越向下层,越靠近硬件,抽象也相对接近硬件。而且高层软件依靠下层软件提供的服务,再加上本身提供附加服务为更高层服务。总体来讲呈现倒金子塔形式。 下面我们就简要分析一下操作系统的体系结构,然后再谈谈操作系统设计时需要主要考虑的问题。操作系统组成 在形形色色的操作系统之中,组成结构不尽相同。因为同样目的实现的手段可以自由选择,所以其组成也有很大差异,我们选取最普遍的操作系统(unix)组成结构,向大家揭示操作系统的体系结构的大致框架。对于各种操作系统之间的具体差异,大家可以以下面讲述的结构对比认识。(注意我们这里所说的操作系统属于宏观概念,接近于操作系统发行版,不但包括了内核,还包含了学多系统软件和基础应用软件。) 我们用一组简单的数学公式来描述操作系统的组成要素: 操作系统 = 内核+系统程序 系统程序 = 编译环境 + api + aui 编译环境 = 编译程序+连接程序 + 装载程序 api = 系统调用 + 语言库函数(c,c++,java,etc) aui = shell + 系统服务例程(如x服务器等)+应用程序(浏览器,字处理,编辑器) &nb |