并行性和并发性(Concurrence)是既相似又有区别的两个概念,并行性是指两个或多个
事件在同一时刻发生;而并发性是指两个或多个事件在同一时间间隔内发生。在多道程序
环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机系统中,
每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算
机系统中有多个处理机,则这些可以并发执行的程序便可被分配到多个处理机上,实现并
行执行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可同时执行。
通常的程序是静态实体(Passive Entity),在多道程序系统中,它们是不能独
立运行的,更不能和其它程序并发执行。在操作系统中引入进程的目的,就是为了使多个
程序能并发执行。
为使多个程序能并发执行,系统必须分别为每个程序建立进程(Process)。简单说来,进
程是指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆
栈等组成的,是一个能独立运行的活动实体。多个进程之间可以并发执行和交换信息。一
个进程在运行时需要一定的资源,如CPU、存储空间及I/O 设备等。
OS中程序的并发执行将使系统复杂化,以致在系统中必须增设若干新的功能模块,分
别用于对处理机、内存、I/O 设备以及文件系统等资源进行管理,并控制系统中作业的运行。
事实上,进程和并发是现代操作系统中最重要的基本概念,也是操作系统运行的基础
长期以来,进程都是操作系统中可以拥有资源并作为独立运行的基本单位。当一个进
程因故不能继续运行时,操作系统便调度另一进程运行。由于进程拥有自己的资源,故使
调度付出的开销较大。直到20 世纪80 年代中期,人们才又提出了比进程更小的单位——
线程(Threads)。
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线
程的OS中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度
的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销
就会小得多,能更高效地提高系统内多个程序间并发执行的程度。因而近年来推出的通用
操作系统都引入了线程,以便进一步提高系统的并发性,并把它视作现代操作系统的一个
重要标致。
在操作系统环境下,所谓共享(Sharing),是指系统中的资源可供内存中多个并发执行
的进程(线程)共同使用,相应地,把这种资源共同使用称为资源共享,或称为资源复用
由于各种资源的属性不同,进程对资源复用的方式也不同,目前主要实现资源共享的方式有
如下两种。
系统中的某些资源,如打印机、磁带机,虽然它们可以提供给多个进程(线程)使用,但
为使所打印或记录的结果不致造成混淆,应规定在一段时间内只允许一个进程(线程)访问该
资源。为此,系统中应建立一种机制,以保证对这类资源的互斥访问。当一个进程A 要访
问某资源时,必须先提出请求。如果此时该资源空闲,系统便可将之分配给请求进程A 使
用。此后若再有其它进程也要访问该资源时(只要A 未用完),则必须等待。仅当A 进程访
问完并释放该资源后,才允许另一进程对该资源进行访问。我们把这种资源共享方式称为
互斥式共享,而把在一段时间内只允许一个进程访问的资源称为临界资源或独占资源。计
算机系统中的大多数物理设备,以及某些软件中所用的栈、变量和表格,都属于临界资源,
它们要求被互斥地共享。为此,在系统中必需配置某种机制来保证诸进程互斥地使用独占
资源。
系统中还有另一类资源,允许在一段时间内由多个进程“同时”对它们进行访问。这
里所谓的“同时”,在单处理机环境下往往是宏观上的,而在微观上,这些进程可能是交替
地对该资源进行访问。典型的可供多个进程“同时”访问的资源是磁盘设备,一些用重入
码编写的文件也可以被“同时”共享,即若干个用户同时访问该文件。
并发和共享是操作系统的两个最基本的特征,它们又是互为存在的条件。一方面,资
源共享是以程序(进程)的并发执行为条件的,若系统不允许程序并发执行,自然不存在资源
共享问题;另一方面,若系统不能对资源共享实施有效管理,协调好诸进程对共享资源的
访问,也必然影响到程序并发执行的程度,甚至根本无法并发执行。
操作系统中的所谓“虚拟”(Virtual),是指通过某种技术把一个物理实体变为若干个
逻辑上的对应物。物理实体(前者)是实的,即实际存在的,而后者是虚的,仅是用户感觉上
的东西。相应地,用于实现虚拟的技术称为虚拟技术。在操作系统中利用了两种方式实现
虚拟技术,即时分复用技术和空分复用技术。
时分复用,亦即分时使用方式,它最早用于电信业中。为了提高信道的利用率,人们
利用时分复用方式,将一条物理信道虚拟为多条逻辑信道,将每条信道供一对用户通话。
在计算机领域中,广泛利用该技术来实现虚拟处理机、虚拟设备等,以提高资源的利用率。
1) 虚拟处理机技术
在虚拟处理机技术中,利用多道程序设计技术,为每道程序建立一个进程,让多道程
序并发地执行,以此来分时使用一台处理机。此时,虽然系统中只有一台处理机,但它却
能同时为多个用户服务,使每个终端用户都认为是有一个处理机在专门为他服务。亦即,
利用多道程序设计技术,把一台物理上的处理机虚拟为多台逻辑上的处理机,在每台逻辑
处理机上运行一道程序。我们把用户所感觉到的处理机称为虚拟处理器。
2) 虚拟设备技术
我们还可以通过虚拟设备技术,将一台物理I/O 设备虚拟为多台逻辑上的I/O 设备,并
允许每个用户占用一台逻辑上的I/O 设备,这样便可使原来仅允许在一段时间内由一个用户
访问的设备(即临界资源),变为在一段时间内允许多个用户同时访问的共享设备。例如,原
来的打印机属于临界资源,而通过虚拟设备技术,可以把它变为多台逻辑上的打印机,供
多个用户“同时”打印。
早在上世纪初,电信业中就使用频分复用技术来提高信道的利用率。它是将一个频率
范围非常宽的信道,划分成多个频率范围较窄的信道,其中的任何一个频带都只供一对用
户通话。早期的频分复用只能将一条物理信道划分为十几条到几十条话路,后来又很快发
展成上万条话路,每条话路也只供一对用户通话。之后,在计算机中也使用了空分复用技
术来提高存储空间的利用率。
1) 虚拟磁盘技术
通常在一台机器上只配置一台硬盘。我们可以通过虚拟磁盘技术将一台硬盘虚拟为多
台虚拟磁盘,这样使用起来既方便又安全。虚拟磁盘技术也是采用了空分复用方式,即它
将硬盘划分为若干个卷,例如1、2、3、4 四个卷,再通过安装程序将它们分别安装在C、
D、E、F 四个逻辑驱动器上,这样,机器上便有了四个虚拟磁盘。当用户要访问D 盘中的
内容时,系统便会访问卷2 中的内容。
2) 虚拟存储器技术
在单道程序环境下,处理机会有很多空闲时间,内存也会有很多空闲空间,显然,这
会使处理机和内存的效率低下。如果说时分复用技术是利用处理机的空闲时间来运行其它
的程序,使处理机的利用率得以提高,那么空分复用则是利用存储器的空闲空间来存放其
它的程序,以提高内存的利用率。
但是,单纯的空分复用存储器只能提高内存的利用率,并不能实现在逻辑上扩大存储
器容量的功能,必须引入虚拟存储技术才能达到此目地。而虚拟存储技术在本质上就是使
内存分时复用。它可以使一道程序通过时分复用方式,在远小于它的内存空间中运行。例
如,一个100 MB的应用程序可以运行在20 MB的内存空间。下一节将要介绍的用于实现
内存扩充的“请求调入功能”和“置换功能”就是用于每次只把用户程序的一部分调入内
存运行,这样便实现了用户程序的各个部分分时进入内存运行的功能。
应当着重指出:如果虚拟的实现是通过时分复用的方法来实现的,即对某一物理设备
进行分时使用,设N 是某物理设备所对应的虚拟的逻辑设备数,则每台虚拟设备的平均速
度必然等于或低于物理设备速度的1/N。类似地,如果是利用空分复用方法来实现虚拟,此
时一台虚拟设备平均占用的空间必然也等于或低于物理设备所拥有空间的1/N。
在多道程序环境下允许多个进程并发执行,但只有进程在获得所需的资源后方能执行。
在单处理机环境下,由于系统中只有一台处理机,因而每次只允许一个进程执行,其余进
程只能等待。当正在执行的进程提出某种资源要求时,如打印请求,而此时打印机正在为其它某进程打印,由于打印机属于临界资源,因此正在执行的进程必须等待,且放弃处理
机,直到打印机空闲,并再次把处理机分配给该进程时,该进程方能继续执行。可见,由
于资源等因素的限制,使进程的执行通常都不是“一气呵成”,而是以“停停走走”的方式
运行。
内存中的每个进程在何时能获得处理机运行,何时又因提出某种资源请求而暂停,以
及进程以怎样的速度向前推进,每道程序总共需多少时间才能完成,等等,这些都是不可
预知的。由于各用户程序性能的不同,比如,有的侧重于计算而较少需要I/O,而有的程序
其计算少而I/O 多,这样,很可能是先进入内存的作业后完成,而后进入内存的作业先完成。
或者说,进程是以人们不可预知的速度向前推进,此即进程的异步性(Asynchronism)。尽管
如此,但只要在操作系统中配置有完善的进程同步机制,且运行环境相同,作业经多次运
行都会获得完全相同的结果。因此,异步运行方式是允许的,而且是操作系统的一个重要
特征。