1.2 操作系统的基本特征
1.2.1 并发性
并发性(Concurrency)是指若干个事件或活动在同一时间段内发生。操作系统是一个并发系统,并发性是它的最基本特征。操作系统的并发性是指在某一段时间内,计算机系统中若干程序都处于已经启动但尚未结束的状态。也就是说,计算机系统的内存中允许同时有多个用户程序,或内存中同时有操作系统程序和用户程序被交替、穿插地执行。操作系统具有处理和调度多个程序并发执行的能力。在单处理器系统中,程序的并发执行是指宏观上有多个程序在同时运行,微观上多个程序只能轮流交替执行。
并行(Parallel)是与并发相似的另一个概念,它是指若干个事件在同一时刻发生,因此,并行是并发的一个特例。在多处理器系统中,由于多个程序同一时刻可在不同CPU上运行,因此程序的运行是并行的。但在单处理器环境下,由于每一时刻CPU只能运行一个程序,所以单处理器系统中并不存在多个程序真正的并行。举个例子,可以把体育比赛中的接力赛看成是一种并发活动,接力棒相当于CPU,选手相当于程序,跑道相当于内存。单组接力(一个接力棒)就是单处理器下的并发活动;多组接力(多个接力棒)就是多处理器下的并发活动,此时会出现并行的情况(多名选手同时持棒在跑)。通常情况下,我们讨论的并发活动主要指单处理器下的并发活动;而多处理器下的情况比较复杂,关注的多是并行活动。
那么,单处理器下的并发是如何实现的呢?这要从程序的逻辑结构说起。通常,每个程序都由两部分组成:一是CPU处理部分,二是I/O处理部分,不同的程序中这两部分所占比重也不同。在通道和中断技术的支持下,一个程序的CPU处理与另一个程序的I/O处理可以同时进行,这也使得多道程序实现并发成为可能。事实上,单处理器系统中实现并发的本质思想:当一个程序发生事件(如等待I/O)时让出其占用的CPU而由另一个程序运行,即一个程序在进行I/O处理的同时让另一程序在CPU上运行。因此,实现并发技术的关键之一在于如何对系统内的多个运行程序进行调度和切换。
操作系统的并发性能够消除计算机系统中各程序之间的相互等待,有效地改善系统资源的利用率,从而提高了系统效率。但是并发也会引发一系列的问题,使操作系统的设计和实现变得复杂化。例如,在系统中的多个程序之间如何分配资源、如何切换运行状态、如何不对其他运行的程序造成影响等。
1.2.2 共享性
共享性(Sharing)是操作系统的另一个主要特性。共享是指计算机系统资源能被内存中的多个并发执行的系统程序和用户程序共同使用,而不是让某一个程序独享。如果一次性向每个用户程序分别提供它所需的全部资源不但是浪费的,有时也是不现实的。一种有效的做法是让操作系统程序和其他用户程序公用计算机系统的全部资源,这样可以减少浪费,从而提高系统资源的利用率。从实现的角度来看,资源共享有两种方式:互斥共享和同时共享。
(1)互斥共享是指系统中的某些资源,如打印机、磁带机等,虽然它们可以被多个程序共同使用,但在某一段时间内只允许一个程序使用,其他程序不能使用,即程序之间要互斥使用该资源,只有等到一个程序使用完后其他程序才能使用。一次只允许被一个程序使用的资源称为临界资源。计算机系统中的许多物理设备,主要是字符设备,以及某些软件中的数据、表格、变量等都可能是临界资源,它们只能被互斥访问。
(2)同时共享是指系统中的某些资源能够在一段时间内被多个程序同时使用。但在单处理器系统中,这里的同时只是个宏观上的概念,因为实际上这些程序是在一个时间段内并发使用这些资源,如对磁盘文件的同时访问其实也是交替进行的。
1.2.3 虚拟性
虚拟性(Virtual)是指操作系统中的一种管理技术,它是把一个物理设备转换为若干个对应的逻辑设备,或者把多个物理设备转换成一个逻辑设备的技术。采用虚拟技术的目的是为用户提供易于使用、方便管理的操作环境。例如,在分时系统中,虽然物理CPU只有一个,但通过使用分时技术,在宏观上还是有多个程序在同时运行,就好像一个物理CPU变成逻辑上的多个CPU一样,每个用户程序就在属于它自己的逻辑CPU上运行。还有,共享打印机技术也是利用某种虚拟I/O技术(SPOOLing技术)实现的。同样,利用窗口技术可把物理上的一个屏幕变成逻辑上的多个虚拟屏幕。在操作系统中,虚拟性表现的另一个重要方面就是普遍采用的虚拟存储技术。为了能运行比物理内存大得多的应用程序,虚拟存储技术将内存和外存有机地结合起来,向用户提供足够大的虚拟内存空间。总之,虚拟技术的应用既方便用户使用计算机,也提高了系统的性能和资源利用率。
1.2.4 异步性
异步性(Asynchronism)也称随机性或不确定性。在多道系统中,允许多个进程并发执行。但由于系统内资源数量有限,而进程数量又往往多于资源数量,因此,进程必须相互竞争使用资源。当一个进程申请的资源被另一个进程占用时,该进程只能暂停执行,直到该进程拥有这个资源后才能继续执行。因此,进程的执行顺序和执行时间存在着不确定性,即进程是以异步的方式运行,“走走停停”。很显然,这种异步性给系统带来了潜在的危险,若处理不好,可能会产生与时间有关的错误。可以说,操作系统是运行在随机的环境下。但只要环境相同,操作系统必须保证同一进程的多次运行,都会获得完全相同的结果。
在操作系统中,随机性的例子到处可见。例如,作业进入系统的时间和类型是随机的,操作员使用命令的时刻是随机的,程序运行中发生错误或异常的时刻是随机的,各种硬件中断信号产生的时刻是随机的,等等。面对这些随机发生的事件,操作系统必须确保捕捉任何一种随机事件并做出正确处理,否则将会导致严重后果。