一、 处理机管理功能
在传统的多道程序系统中,处理机的分配和运行都是以进程为基本单位,因而对处理
机的管理可归结为对进程的管理;在引入了线程的OS中,也包含对线程的管理。处理机管
理的主要功能是创建和撤消进程(线程),对诸进程(线程)的运行进行协调,实现进程(线程)
之间的信息交换,以及按照一定的算法把处理机分配给进程(线程)。
1.进程控制
在传统的多道程序环境下,要使作业运行,必须先为它创建一个或几个进程,并为之
分配必要的资源。当进程运行结束时,立即撤消该进程,以便能及时回收该进程所占用的
各类资源。进程控制的主要功能是为作业创建进程,撤消已结束的进程,以及控制进程在
运行过程中的状态转换。在现代OS中,进程控制还应具有为一个进程创建若干个线程的功
能和撤消(终止)已完成任务的线程的功能。
2.进程同步
前已述及,进程是以异步方式运行的,并以人们不可预知的速度向前推进。为使多个
进程能有条不紊地运行,系统中必须设置进程同步机制。进程同步的主要任务是为多个进
程(含线程)的运行进行协调。有两种协调方式:
(1) 进程互斥方式。这是指诸进程(线程)在对临界资源进行访问时,应采用互斥方式;
第一章操作系统引论·19·
(2) 进程同步方式。这是指在相互合作去完成共同任务的诸进程(线程)间,由同步机构
对它们的执行次序加以协调。
为了实现进程同步,系统中必须设置进程同步机制。最简单的用于实现进程互斥的机
制是为每一个临界资源配置一把锁W,当锁打开时,进程(线程)可以对该临界资源进行访问;
而当锁关上时,则禁止进程(线程)访问该临界资源。而实现进程同步的最常用的机制则是信
号量机制,我们将在第二章中做详细介绍。
3.进程通信
在多道程序环境下,为了加速应用程序的运行,应在系统中建立多个进程,并且再为
一个进程建立若干个线程,由这些进程(线程)相互合作去完成一个共同的任务。而在这些进
程(线程)之间,又往往需要交换信息。例如,有三个相互合作的进程,它们是输入进程、计
算进程和打印进程。输入进程负责将所输入的数据传送给计算进程;计算进程利用输入数
据进行计算,并把计算结果传送给打印进程;最后,由打印进程把计算结果打印出来。进
程通信的任务就是用来实现在相互合作的进程之间的信息交换。
当相互合作的进程(线程)处于同一计算机系统时,通常在它们之间是采用直接通信方
式,即由源进程利用发送命令直接将消息(Message)挂到目标进程的消息队列上,以后由目
标进程利用接收命令从其消息队列中取出消息。
4.调度
在后备队列上等待的每个作业都需经过调度才能执行。在传统的操作系统中,包括作
业调度和进程调度两步。
(1) 作业调度。作业调度的基本任务是从后备队列中按照一定的算法,选择出若干个
作业,为它们分配运行所需的资源(首先是分配内存)。在将它们调入内存后,便分别为它
们建立进程,使它们都成为可能获得处理机的就绪进程,并按照一定的算法将它们插入就
绪队列。
(2) 进程调度。进程调度的任务是从进程的就绪队列中,按照一定的算法选出一个进程,
把处理机分配给它,并为它设置运行现场,使进程投入执行。值得提出的是,在多线程OS
中,通常是把线程作为独立运行和分配处理机的基本单位,为此,须把就绪线程排成一个
队列,每次调度时,是从就绪线程队列中选出一个线程,把处理机分配给它。
二、存储器管理功能
存储器管理的主要任务是为多道程序的运行提供良好的环境,方便用户使用存储器,
提高存储器的利用率以及能从逻辑上扩充内存。为此,存储器管理应具有内存分配、内存
保护、地址映射和内存扩充等功能。
1.内存分配
内存分配的主要任务是为每道程序分配内存空间,使它们“各得其所”;提高存储器的
利用率,以减少不可用的内存空间;允许正在运行的程序申请附加的内存空间,以适应程
序和数据动态增长的需要。
OS在实现内存分配时,可采取静态和动态两种方式。在静态分配方式中,每个作业的
内存空间是在作业装入时确定的;在作业装入后的整个运行期间,不允许该作业再申请新
的内存空间,也不允许作业在内存中“移动”。在动态分配方式中,每个作业所要求的基本
内存空间也是在装入时确定的,但允许作业在运行过程中继续申请新的附加内存空间,以
适应程序和数据的动态增长,也允许作业在内存中“移动”。
为了实现内存分配,在内存分配的机制中应具有这样的结构和功能:
(1) 内存分配数据结构。该结构用于记录内存空间的使用情况,作为内存分配的依据;
(2) 内存分配功能。系统按照一定的内存分配算法为用户程序分配内存空间;
(3) 内存回收功能。系统对于用户不再需要的内存,通过用户的释放请求去完成系统的
回收功能。
2.内存保护
内存保护的主要任务是确保每道用户程序都只在自己的内存空间内运行,彼此互不干
扰;绝不允许用户程序访问操作系统的程序和数据;也不允许用户程序转移到非共享的其
它用户程序中去执行。
为了确保每道程序都只在自己的内存区中运行,必须设置内存保护机制。一种比较简
单的内存保护机制是设置两个界限寄存器,分别用于存放正在执行程序的上界和下界。系
统须对每条指令所要访问的地址进行检查,如果发生越界,便发出越界中断请求,以停止
该程序的执行。如果这种检查完全用软件实现,则每执行一条指令,便须增加若干条指令
去进行越界检查,这将显著降低程序的运行速度。因此,越界检查都由硬件实现。当然,
对发生越界后的处理,还须与软件配合来完成。
3.地址映射
一个应用程序(源程序)经编译后,通常会形成若干个目标程序;这些目标程序再经过链
接便形成了可装入程序。这些程序的地址都是从“0”开始的,程序中的其它地址都是相对
于起始地址计算的。由这些地址所形成的地址范围称为“地址空间”,其中的地址称为“逻
辑地址”或“相对地址”。此外,由内存中的一系列单元所限定的地址范围称为“内存空间”,
其中的地址称为“物理地址”。
在多道程序环境下,每道程序不可能都从“0”地址开始装入(内存),这就致使地址空
间内的逻辑地址和内存空间中的物理地址不相一致。为使程序能正确运行,存储器管理必
须提供地址映射功能,以将地址空间中的逻辑地址转换为内存空间中与之对应的物理地址。
该功能应在硬件的支持下完成。
4.内存扩充
存储器管理中的内存扩充任务并非是去扩大物理内存的容量,而是借助于虚拟存储技
术,从逻辑上去扩充内存容量,使用户所感觉到的内存容量比实际内存容量大得多,以便
让更多的用户程序并发运行。这样,既满足了用户的需要,又改善了系统的性能。为此,
只需增加少量的硬件。为了能在逻辑上扩充内存,系统必须具有内存扩充机制,用于实现
下述各功能:
(1) 请求调入功能。允许在装入一部分用户程序和数据的情况下,便能启动该程序运行。
在程序运行过程中,若发现要继续运行时所需的程序和数据尚未装入内存,可向OS发出请
求,由OS从磁盘中将所需部分调入内存,以便继续运行。
(2) 置换功能。若发现在内存中已无足够的空间来装入需要调入的程序和数据时,系统
第一章操作系统引论·21·
应能将内存中的一部分暂时不用的程序和数据调至盘上,以腾出内存空间,然后再将所需
调入的部分装入内存。
三、 设备管理功能
设备管理用于管理计算机系统中所有的外围设备,而设备管理的主要任务是:完成用
户进程提出的I/O 请求;为用户进程分配其所需的I/O 设备;提高CPU 和I/O 设备的利用
率;提高I/O 速度;方便用户使用I/O 设备。为实现上述任务,设备管理应具有缓冲管理、
设备分配和设备处理以及虚拟设备等功能。
1.缓冲管理
CPU 运行的高速性和I/O 低速性间的矛盾自计算机诞生时起便已存在了。而随着CPU
速度迅速提高,使得此矛盾更为突出,严重降低了CPU的利用率。如果在I/O 设备和CPU
之间引入缓冲,则可有效地缓和CPU与I/O 设备速度不匹配的矛盾,提高CPU的利用率,
进而提高系统吞吐量。因此,在现代计算机系统中,都无一例外地在内存中设置了缓冲区,
而且还可通过增加缓冲区容量的方法来改善系统的性能。
对于不同的系统,可以采用不同的缓冲区机制。最常见的缓冲区机制有单缓冲机制、
能实现双向同时传送数据的双缓冲机制,以及能供多个设备同时使用的公用缓冲池机制。
上述这些缓冲区都将由OS中的缓冲管理机制将它们管理起来。
2.设备分配
设备分配的基本任务是根据用户进程的I/O 请求、系统的现有资源情况以及按照某种设
备的分配策略,为之分配其所需的设备。如果在I/O 设备和CPU 之间还存在着设备控制器
和I/O 通道时,还须为分配出去的设备分配相应的控制器和通道。
为了实现设备分配,系统中应设置设备控制表、控制器控制表等数据结构,用于记录
设备及控制器的标识符和状态。根据这些表格可以了解指定设备当前是否可用,是否忙碌,
以供进行设备分配时参考。在进行设备分配时,应针对不同的设备类型而采用不同的设备
分配方式。对于独占设备(临界资源)的分配,还应考虑到该设备被分配出去后系统是否安全。
在设备使用完后,应立即由系统回收。
3.设备处理
设备处理程序又称为设备驱动程序。其基本任务是用于实现CPU和设备控制器之间的
通信,即由CPU 向设备控制器发出I/O 命令,要求它完成指定的I/O 操作;反之,由CPU
接收从控制器发来的中断请求,并给予迅速的响应和相应的处理。
处理过程是:设备处理程序首先检查I/O 请求的合法性,了解设备状态是否是空闲的,
了解有关的传递参数及设置设备的工作方式。然后,便向设备控制器发出I/O 命令,启动I/O
设备去完成指定的I/O 操作。设备驱动程序还应能及时响应由控制器发来的中断请求,并根
据该中断请求的类型,调用相应的中断处理程序进行处理。对于设置了通道的计算机系统,
设备处理程序还应能根据用户的I/O 请求,自动地构成通道程序。
四、 文件管理功能
在现代计算机管理中,总是把程序和数据以文件的形式存储在磁盘和磁带上,供所有
的或指定的用户使用。为此,在操作系统中必须配置文件管理机构。文件管理的主要任务
是对用户文件和系统文件进行管理,以方便用户使用,并保证文件的安全性。为此,文件
管理应具有对文件存储空间的管理、目录管理、文件的读/写管理,以及文件的共享与保护
等功能。
1.文件存储空间的管理
为了方便用户的使用,对于一些当前需要使用的系统文件和用户文件,都必须放在可
随机存取的磁盘上。在多用户环境下,若由用户自己对文件的存储进行管理,不仅非常困
难,而且也必然是十分低效的。因而,需要由文件系统对诸多文件及文件的存储空间实施
统一的管理。其主要任务是为每个文件分配必要的外存空间,提高外存的利用率,并能有
助于提高文件系统的存、取速度。
为此,系统应设置相应的数据结构,用于记录文件存储空间的使用情况,以供分配存
储空间时参考;系统还应具有对存储空间进行分配和回收的功能。为了提高存储空间的利
用率,对存储空间的分配,通常是采用离散分配方式,以减少外存零头,并以盘块为基本
分配单位。盘块的大小通常为1~8 KB。
2.目录管理
为了使用户能方便地在外存上找到自己所需的文件,通常由系统为每个文件建立一个
目录项。目录项包括文件名、文件属性、文件在磁盘上的物理位置等。由若干个目录项又
可构成一个目录文件。目录管理的主要任务是为每个文件建立其目录项,并对众多的目录
项加以有效的组织,以实现方便的按名存取,即用户只须提供文件名便可对该文件进行存
取。其次,目录管理还应能实现文件共享,这样,只须在外存上保留一份该共享文件的副
本。此外,还应能提供快速的目录查询手段,以提高对文件的检索速度。
3.文件的读/写管理和保护
(1) 文件的读/写管理。该功能是根据用户的请求,从外存中读取数据,或将数据写入
外存。在进行文件读(写)时,系统先根据用户给出的文件名去检索文件目录,从中获得文件
在外存中的位置。然后,利用文件读(写)指针,对文件进行读(写)。一旦读(写)完成,便修
改读(写)指针,为下一次读(写)做好准备。由于读和写操作不会同时进行,故可合用一个
读/写指针。
(2) 文件保护。为了防止系统中的文件被非法窃取和破坏,在文件系统中必须提供有效
的存取控制功能,以实现下述目标:
① 防止未经核准的用户存取文件;
② 防止冒名顶替存取文件;
③ 防止以不正确的方式使用文件。
五、面向对象的程序设计
1.面向对象技术的基本概念
面向对象技术是20 世纪80 年代初提出并很快流行起来的。该技术是基于“抽象”和
“隐蔽”原则来控制大型软件的复杂度的。所谓对象,是指在现实世界中具有相同属性、
服从相同规则的一系列事物(事物可以是一个物理实体、一个概念或一个软件模块等)的抽
象,而把其中的具体事物称为对象的实例。如果在OS中的各类实体如进程、线程、消息、
存储器和文件等,都使用了对象这一概念,相应地,便有了进程对象、线程对象、存储器
对象和文件对象等。
1) 对象
在面向对象的技术中,是利用被封装的数据结构(变量)和一组对它进行操作的过程(方
法),来表示系统中的某个对象的,如图1-7 所示。对象中的变量(数据)也称为属性,它可以
是单个标量或一张表。面向对象中的方法是用于执行某种功能的过程,它可以改变对象的
状态,更新对象中的某些数据值或作用于对象所要访问的外部
资源。如果把一个文件作为一个对象(见图1-8),该对象的变
量便是文件类型、文件大小、文件的创建者等。对象中的方法
包含对文件的操作,如创建文件、打开文件、读文件、写文件、
关闭文件等。
对象中的变量(数据)对外是隐蔽的,因而外界不能对它直
接进行访问,必须通过该对象中的一组方法(操作函数)对它进
行访问。例如要想对上面的文件A 执行打开操作,必须用该对象中的打开过程去打开它。
同样对象中的一组方法的实现细节也是隐蔽的,因此,对象中的变量可以得到很好的保护,
而不会允许未经受权者使用和不正确的操作。
2) 对象类
在实践中,有许多对象可能表示的是同一类事物,每个对象具有自己的变量集合,而
它们所具有的方法是相同的。如果为每一个相似的对象都定义一组变量和方法,显然是低
效的,由此产生了“对象类”的概念,利用“对象类”来定义一组大体相似的对象。一个
类同样定义了一组变量和针对该变量的一组方法,用它们来描述一组对象的共同属性和行
为。类是在对象上的抽象,对象则是类的实例。对象类中所定义的变量在实例中均有具体
的值。
例如,我们将文件设计成一个类,类的变量同样是文件类型、文件大小和文件的创建
者等。类中的方法是文件的创建、打开、读写、关闭等。图1-8 示出了一个文件类,在类的
变量中,没有具体数值,一旦被赋予了具体数值就成了文件A 对象。对象类的概念非常有
用,因为它极大地提高了创建多个相似对象的效率。
3) 继承
在面向对象的技术中,可以根据已有类来定义一个新的类,新类被称为子类(B),原来
的类被称为父类(A),见图1-9。继承是父类和子类之间共享变量和方法的机制,该机制规
定,子类自动继承父类中定义的变量和方法,并允许子类再
增加新的内容。继承特性可使定义子类变得更为容易。一个
父类可以定义多个子类,它们分别是父类的某种特例,父类
描述了这些子类的公共变量和方法。类似地,这些子类又可
以定义自己的子类,通过此途经可以生成一个继承的层次。
另外,也允许一个子类有两个父类或多个父类,它可以从多
个父类获得继承,此时称为“多重继承”。
2.面向对象技术的优点
在设计操作系统时,将计算机中的实体作为对象来处理,可带来如下好处:
(1) 通过“重用”提高产品质量和生产率。
在面向对象技术中可通过“重用”以前项目中经过精心测试的对象,或由其他人编写、
测试和维护的对象类,来构建新的系统,这不仅可大大降低开发成本,而且能获得更好的
系统质量。
(2) 使系统具有更好的易修改性和易扩展性。
通过封装,可隐蔽对象中的变量和方法,因而当改变对象中的变量和方法时,不会影
响到其它部分,从而可方便地修改老的对象类。另外,继承是面向对象技术的重要特性,
在创建一个新对象类时,通过利用继承特性,可显著地减少开发的时空开销,使系统具有
更好的易扩展性和灵活性。
(3) 更易于保证系统的“正确性”和“可靠性”。
对象是构成操作系统的基本单元,由于可以独立地对它进行测试,易于保证每个对象
的正确性和可靠性,因此也就比较容易保证整个系统的正确性和可靠性。此外,封装对对
象类中的信息进行了隐蔽,这样又可有效地防止未经授权者的访问和用户不正确的使用,
有助于构建更为安全的系统