操作系统(Operating System,OS)是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充。其主要作用是管理好这些设备,提高它们的利用率和系统的吞吐量,并为用户和应用程序提供一个简单的接口,便于用户使用。OS是现代计算机系统中最基本和最重要的系统软件,而其它的诸如编译程序、数据库管理系统等系统软件,以及大量的应用软件,都直接依赖于操作系统的支持,取得它所提供的服务。事实上OS已成为现代计算机系统、多处理机系统、计算机网络中都必须配置的系统软件。
操作系统的目标与应用环境有关。例如在查询系统中所用的OS,希望能提供良好的人-机交互性;对于应用于工业控制、武器控制以及多媒体环境下的OS,要求其具有实时性;而对于微机上配置的OS,则更看重的是其使用的方便性。
在计算机系统上配置操作系统,其主要目的是:方便性、有效性、可扩充性和开放性。
方便性
一个未配置OS的计算机系统是极难使用的。用户如果想直接在计算机硬件(裸机)上运行自己所编写的程序,就必须用机器语言书写程序。但如果在计算机硬件上配置了OS,系统便可以使用编译命令将用户采用高级语言书写的程序翻译成机器代码,或者直接通过OS所提供的各种命令操作计算机系统,极大地方便了用户,使计算机变得易学易用。
有效性
有效性所包含的第一层含义是提高系统资源的利用率。在早期未配置OS的计算机系统中,诸如处理机、I/O设备等都经常处于空闲状态,各种资源无法得到充分利用,所以在当时,提高系统资源利用率是推动OS发展最主要的动力。有效性的另一层含义是,提高系统的吞吐量。OS可以通过合理地组织计算机的工作流程,加速程序的运行,缩短程序的运行周期,从而提高了系统的吞吐量。
可扩充性
为适应计算机硬件、体系结构以及计算机应用发展的要求,OS必须具有很好的可扩展性。可扩展性的好坏与OS的结构有着十分紧密的连续,由此推动了OS结构的不断发展:从早期的无结构发展成模块化结构,进而又发展成层次结构,近年来OS已广泛采用了微内核结构。微内核结构能方便地增添新的功能和模块,以及对原有的功能和模块进行修改,具有良好的可扩充性。
开放性
所谓开放性,是指系统能遵循世界标准规范,特别是遵循开放系统互连OSI国际标准。事实上,凡遵循国际标准所开发的硬件和软件,都能彼此兼容,方便地实现互连。开放性已成为20世纪90年代以后计算机技术的一个核心问题,也是衡量一个新推出的系统或软件能否被广泛应用的至关重要的因素。
OS作为用户与计算机硬件系统之间的接口
OS处于用户与计算机硬件系统之间,用户通过OS来使用计算机系统。或者说,用户在OS帮助下能够方便、快捷、可靠地操纵计算机硬件和运行自己的程序。下图是OS作为接口的示意图,可以看出用户可通过三种方式使用计算机,即通过命令方式、系统调用方式和图标-窗口方式来实现与操作系统的通信,并取得它的服务。
OS作为计算机系统资源的管理者
在一个计算机系统中,通常都含有多种硬件和软件资源。归纳起来可将这些资源分为四类:处理机、存储器、I/O设备以及文件(数据和程序)。相应地,OS的主要功能也正是对这四类资源进行有效的管理。处理机管理是用于分配和控制处理机;存储器管理主要负责内存的分配与回收;I/O设备管理是负责I/O设备的分配(回收)与操纵;文件管理是用于实现对文件的存取、共享和保护。
另外,当一台计算机系统同时供多个用户使用时,诸多用户对系统中共享资源的需求(包括数量和时间)有可能发生冲突。为此,操作系统必须对使用资源的请求进行授权,以协调诸用户对共享资源的使用。
OS实现了对计算机资源的抽象
对于一台完全无软件的计算机系统(即裸机),由于它向用户提供的仅是硬件接口(物理接口),因此,用户必须对物理接口的实现细节有充分的了解,这就致使该物理机器难于广泛使用。为了方便用户使用I/O设备,人们在裸机上覆盖上一层I/O设备管理软件,如下图所示,由它来实现对I/O设备操作的细节,并向上将I/O设备抽象为一组数据结构以及一组I/O操作命令,如read和write命令,这样用户即可利用这些数据结构即操作命令来进行数据输入或输出,而无需关心I/O是如何具体实现的。
正是系统中的程序能并发执行这一特征,才使得OS能有效地提高系统中的资源利用率,增加系统的吞吐量。
并行与并发
并行性是指两个或多个事件在同一时刻发生;并发性是指两个或多个事件在同一时间间隔内发生。
引入进程
在一个未引入进程的系统中,在属于同一个应用程序的计算程序和I/O程序之间只能是顺序执行,即只有在计算程序执行告一段落后,才允许I/O程序执行;反之,在程序执行I/O操作时,计算程序也不能执行。但在为计算程序和I/O程序分别建立一个进程(Process)后,这两个进程便可并发执行。若对内存中的多个程序都分别建立一个进程,它们就可以并发执行,这样便能极大地提高系统资源的利用率,增加系统的吞吐量。
互斥共享方式
系统中的某些资源,如打印机、磁带机等,虽然可以提供给多个进程(线程)使用,但应规定在一段时间内,只允许一个进程访问该资源。为此,在系统中应建立一种机制,以保证多个进程对这类资源的互斥访问。
同时访问方式
系统中还有另一类资源,允许在一段时间内由多个进程“同时”对它们进行访问。这里所谓的“同时”,在单处理机环境下是宏观意义上的,而在微观上,这些进程对该资源的访问是交替进行的。典型的可供多个进程“同时”访问的资源是磁盘设备。一些用重入码编写的文件也可以被“同时”共享,即允许若干个用户同时访问该文件。
在OS中,把通过某种技术将一个物理实体变为若干个逻辑上的对应物的功能称为“虚拟”。
时分复用技术
(1) 虚拟处理机技术。利用多道程序设计技术,为每道程序建立至少一个进程,让多道程序并发执行。
(2) 虚拟设备技术。将一台物理I/O设备虚拟为多台逻辑上的I/O设备,并允许每个用户占用一台逻辑上的I/O设备。
空分复用技术
如果说,多道程序技术(十分复用技术)是通过利用处理机的空闲时间运行其他程序,提高了处理机的利用率,那么,空分复用技术则是利用存储器的空闲空间分区域存放和运行其他的多道程序,以此来提高内存的利用率。
在多道程序环境下,系统允许多个进程并发执行。在单处理机环境下,由于系统中只有一台处理机,因而每次只允许一个进程执行,其余进程只能等待。
对于内存中的每个进程,在何时能获得处理机运行,何时又因提出某种资源请求而暂停,以及进程以怎样的速度向前推进,每道程序总共需要多少时间才能完成等等,都是不可预知的。由于各用户程序性能的不同,很可能是先进入内存的作业后完成,而后进入内存的作业先完成。或者说,进程是以人们不可预知的速度向前推进的,此即进程的异步性。尽管如此,但只要在OS中配置有完善的进程同步制度,且运行环境相同,则作业即便经过多次运行,也都会获得完全相同的结果。因此异步运行方式是允许的,而且是操作系统的一个重要特征。
引入OS的主要目的是,为多道程序的运行提供良好的运行环境,以保证多道程序能有条不紊地、高效地运行,并能最大程度地提高系统中各种资源的利用率,方便用户的使用。为此,在传统的OS中应具有处理机管理、存储器管理、设备管理和文件管理等基本功能。此外,为了方便用户使用OS,还需向用户提供方便的用户接口。
在传统的多道程序系统中,处理机的分配和运行是以进程为基本单位的,因而对处理机的管理可归结为对进程的管理。处理机管理的主要功能有:创建和撤销进程,对诸进程的运行进行协调,实现进程之间的信息交换,以及按照一定的算法把处理机分配给进程。
进程控制
进程同步
进程通信
调度
(1) 作业调度
(2) 进程调度
存储器管理的主要任务,是为多道程序的运行提供良好的环境,提高存储器的利用率,方便用户使用,并能从逻辑上扩充内存。为此,存储器管理应具有内存分配和回收、内存保护、地址映射和内存扩充等功能。
内存分配
内存分配的主要任务是:
(1) 为每道程序分配内存空间,是它们“各得其所”。
(2) 提高存储器的利用率,尽量减少不可用的内存空间(碎片)。
(3) 允许正在运行的程序申请附加的内存空间,以适应程序和数据动态增长的需要。
OS在实现内存分配时,可采取静态和动态两种方式:
(1) 静态分配方式。每个作业的内存空间是在作业装入时确定的,在作业装入后的整个运行期间不允许该作业再申请新的内存空间,也不允许作业在内存中“移动”。
(2) 动态分配方式。每个作业所要求的基本内存空间虽然也是在装入时确定的,但允许作业在运行过程中继续申请新的附加内存空间,以适应程序和数据的动态增长,也允许作业在内存中“移动”。
内存保护
内存保护的主要任务是:①确保每道用户程序都仅在自己的内存空间内运行,彼此互不干扰。②绝不允许用户程序访问操作系统的程序和数据,也不允许用户程序转移到非共享的其它用户程序中去执行。
地址映射
在多道程序环境下,由于每道程序经编译和链接后所形成的可装入程序其地址都是从0开始的,但不可能将它们从“0”地址(物理)开始装入内存,致使(各程序段的)地址空间内的逻辑地址与其在内存空间中的物理地址并不相一致。为保证程序能正确运行,存储器管理必须提供地址映射功能,即能够将地址空间中的逻辑地址转换为内存空间中与之对应的物理地址。该功能在硬件的支持下完成。
内存扩充
内存扩充并非是从物理上去扩大内存的容量,而是借助于虚拟存储技术,从逻辑上扩充内存容量,使用户感觉到内存容量比实际内存容量大得多,以便让更多的用户程序能并发运行。这样既满足了用户的需要,又改善了系统的性能。为了能在逻辑上扩充内存,系统必须设置内存扩充机制(包含少量的硬件),用于实现下述各功能:
(1) 请求调入功能。
(2) 置换功能。
设备管理的主要任务如下:
(1) 完成用户进程提出的I/O请求,为用户进程分配所需的I/O设备,并完成指定的I/O操作。
(2) 提高CPU和I/O设备的利用率,提高I/O速度,方便用户使用I/O设备。
为实现上述任务,设备管理应具有缓冲管理、设备分配和设备处理以及虚拟机设备等功能。
文件管理的主要任务是对用户文件和系统文件进行管理以方便用户使用,并保证文件的安全性。为此,文件管理应具有对文件存储空间的管理、目录管理、文件的读/写管理以及文件的共享与保护等功能。
用户接口
(1) 联机用户接口
(2) 脱机用户接口
(3) 图形用户接口
程序接口
程序接口是为用户程序在执行中访问系统资源而设置的,是用户程序取得操作系统服务的唯一途径。它是由一组系统调用组成的,每一个系统调用都是一个能完成特定功能的子程序。每当应用程序要求OS提供某种服务(功能)时,便调用具有相应功能的系统调用(子程序)。早期的系统调用都是用汇编语言提供的,只有在用汇编语言书写的程序中才能直接使用系统调用。
现代操作系统是在传统操作系统基础上发展起来的,它除了具有传统操作系统的功能外,还增加了面向安全、面向网络和面向多媒体等功能。
系统安全
(1) 认证技术
(2) 密码技术
(3) 访问控制技术
(4) 反病毒技术
网络的功能和服务
(1) 网络通信
(2) 资源管理
(3) 应用互操作
支持多媒体
(1) 接纳控制功能
(2) 实时调度
(3) 多媒体文件的存储
无结构操作系统
在早期开发操作系统时,设计者只是把他的注意力放在功能的实现和获得高的效率上,缺乏收尾一致的设计思想。此时的OS是为数众多的一组过程的集合,每个过程可以任意地相互调用其它过程,致使操作系统内部既复杂又混乱,因此,这种OS是无结构的,也有人把它称为整体系统结构。
模块化结构OS
(1) 模块化程序设计技术的基本概念
模块化程序设计技术是20世纪60年代出现的一种结构化程序设计技术。该技术基于“分解”和“模块化”的原则来控制大型软件的复杂度。为使OS具有较清晰的结构,OS不再是由众多的过程直接构成的,而是按其功能精心地划分为若干个具有一定独立性和大小的模块。如下图,给出了由模块、子模块等组成的模块化OS结构。
(2) 模块独立性
在模块-接口法中,关键问题是模块的划分和规定好模块之间的接口。如果我们在划分模块时将模块划分得太小,虽然可以降低模块本身的复杂性,但会引起模块之间的联系过多,从而会造成系统比较混乱;如果将模块划分得过大,又会增加模块内部的复杂性,使内部的联系增加,因此在划分模块时,应在两者间进行权衡。
衡量模块的独立性的两个标准:
①内聚性,指模块内部各部分间联系的紧密程度。
②耦合度,指模块间相互联系和相互影响的程度。
(3) 模块接口法的优缺点
利用模块-接口法开发的OS,较之无结构OS具有以下明显的优势:
①提高OS设计的正确性、可理解性和可维护性。
②增强OS的可适应性
③加速OS的开发过程
模块化结构设计仍存在的问题:
①在OS设计时,对各模块间的接口规定很难满足在模块设计完成后对接口的实际需求
②在OS设计阶段,设计者必须做出一系列的决定(决策),每一个决定必须建立在上一个决定的基础上,但模块化结构设计中,各模块的设计齐头并进,无法寻找一个可靠的决定顺序,造成各种决定的“无序性”,这将使程序员很难做到“设计中的每一步决定”都是建立在可靠的基础上,因此模块-接口法又被称为“无序模块法”。
分层式结构OS
(1) 分层式结构的基本概念
为了将模块-接口法中“决定顺序”的无序性变为有序性,引入了有序分层法,分层法的设计任务是,在目标系统An和裸机系统(又称宿主系统)A0之间,铺设若干个层次的软件A1、A2、A3、…、An-1,使An通过An-1、An-2、…、A2、A1层,最终能在A0上运行。在操作系统中,常采用自底向上法来铺设这些中间层。
(2)分层结构的有缺点
分层结构的主要优点有:
①易保证系统的正确性。
②易扩充和易维护性。
分层结构的主要缺点是系统效率降低。由于层次结构是分层单向依赖的,必须在每层之间都建立层次间的通信机制,OS每执行一个功能,通常要自上而下地穿越多个层次,这无疑会增加系统的通信开销,从而导致系统效率的降低。
客户/服务器(Client/Server)模式可简称为C/S模式。其在20世纪90年代已风靡全球,不论是LAN,还是企业网,以及Internet所提供的多种服务,都广泛采用了客户/服务器的模式。
客户/服务器模式的由来、组成和类型
客户/服务器系统主要由三部分组成:
(1) 客户机
(2) 服务器
(3) 网络系统
客户/服务器之间的交互
(1) 客户发送请求消息
(2) 服务器接收消息
(3) 服务器回送消息
(4) 客户机接收消息
客户/服务器模式的优点
(1) 数据的分布处理和存储
(2) 便于集中管理
(3) 灵活性和可扩充性
(4) 易于改编应用软件
面向对象技术的基本概念
该技术是基于“抽象”和“隐蔽”原则来控制大型软件的复杂度的。所谓对象,是指在现实世界中具有相同属性、服从相同规则的一系列事物的抽象,而把其中的具体事物称为对象的实例。
面向对象技术的有点
(1) 通过“重用”提高产品质量和生产率。
(2) 使系统具有更好的易修改性和易扩展性。
(3) 更易于保证系统的“正确性”和“可靠性”。
微内核操作系统的基本概念
(1) 足够小的内核
在微内核操作系统中,内核是指精心设计的、能实现现代OS最基本核心功能的小型内核,微内核并非是一个完整的OS,而只是将操作系统中最基本的部分放入微内核,通常包含有:①与硬件处理紧密相关的部分;②一些较基本的功能;③客户和服务器之间的通信。这些OS最基本的部分只是为了构建通用OS提供一个重要基础,这样就可以确保把操作系统内核做得很小。
(2) 基于客户/服务器模式
由于客户/服务器模式具有非常多的优点,故在单机微内核操作系统中几乎无一例外地都采用客户/服务器模式,将操作系统中最基本的部分放入内核中,而把操作系统的绝大部分功能都放在微内核外面的一组服务器(进程)中实现,如用于提供对进程(线程)进行管理的进程(线程)服务器、提供虚拟存储器管理功能的虚拟存储器服务器、提供I/O设备管理的I/O设备管理服务器等,它们都是被作为进程来实现的,运行在用户态,客户与服务器之间是借助微内核提供的消息传递机制来实现信息交互的。如下图是在单机环境下的客户/服务器模式。
(3) 应用“机制与策略分离”原理
在现在操作系统的结构设计中,经常利用“机制与策略分离”的原理来构造OS结构。所谓机制,是指实现某一功能的具体执行机构。而策略,则是在机制的基础上借助于某些参数和算法来实现该功能的优化,或达到不同的功能目标。通常,机制处于一个系统的基层,而策略处于系统的高层。
(4) 采用面向对象技术
操作系统是一个及其复杂的大型软件系统,我们不仅可以通过结构设计来分解操作系统的复杂度,还可以基于面向对象技术中的“抽象”和“隐蔽”原则控制系统的复杂性,再进一步利用“对象”、“封装”和“继承”等概念来确保操作系统的“正确性”、“可靠性”、“易修改性”、“易扩展性”等,并提高操作系统的设计速度。
微内核的基本功能
(1) 进程(线程)管理
(2) 低级存储器管理
(3) 中断和陷入处理
微内核操作系统的有点
(1) 提高了系统的可扩展性
(2) 增强了系统的可靠性
(3) 可移植性强
(4) 提供了对分布式系统的支持
(5) 融入了面向对象技术
微内核操作系统存在的问题
较之早期的操作系统,微内核操作系统的运行效率有所降低。
效率降低最主要的原因是,在完成一次客户对操作系统提出的服务请求时,需要利用消息实现多次交互和进行用户/内核模式与上下文的多次切换。然而,在早期的OS中,用户进程在请求取得OS服务时,一般只需进行两次上下文的切换:一次是在执行系统调用后由用户态转向系统态时;另一次是在系统完成用户请求的服务后,有系统态返回用户态。
在微内核OS中,由于客户和服务器、服务器和服务器之间的通信都需通过微内核,致使同样的服务请求至少需要进行四次上下文切换。第一次是发生在客户发送请求消息给内核,以请求取得某服务器特定的服务时;第二次是发生在由内核把客户的请求消息发往服务器时;第三次是当服务器完成客户请求后,把响应消息发送到内核时;第四次是在内核将响应消息发送给客户时。
实际情况是往往还会引起更多的上下文切换。例如,当某个服务器自身尚无能力完成客户请求而需要其他服务器的帮助时,如下图,其中的文件服务器还需要磁盘服务器的帮助,这时就需要进行8次上下文的切换。