为了描述程序在并发执行时对系统资源的共享,我们需要一个描述程序执行时动态特征的概念,这就是进程。在本节中我们将讨论进程概念、进程控制和进程间的关系。
进程是操作系统中最重要也是最基本的一个概念。掌握这个概念对于理解操作系统实质,对于分析、设计操作系统都具有非常重要的意义。但是迄今为止,对这一概念尚无一个非常确切的、令人满意的、统一的定义。下面是人们从不同的角度对进程所做的解释或所下的定义。
·进程是可以并发执行的程序在一个数据集合上的运行过程。
· 进程是程序的一次执行过程。
·进程是可参与并发执行的程序。
·进程是一个程序及其数据在处理机上执行时所发生的活动。
·进程是在给定初始状态和内存区域的条件下,可以并发执行的程序的一次执行过程。
·进程是一个具有一定独立功能的程序,关于某个数据集合的一次运行活动。
进程是与程序完全不同的新概念,它具有以下特征。
(1)并发性:在内存中的多个进程能在一段时间内同时运行。并发性使得进程的程序执行过程随时会被中断。多个进程的程序可以并发执行,这是进程最基本的特征之一。
(2)动态性:进程是程序的一次执行过程,“动态”是进程另一个最基本的特征。当要完成某项任务时为其创建进程,由处理机调度程序来选择要调度的进程并运行该进程的程序,当资源得不到满足时暂停执行,资源能够满足时,继续执行,直至任务完成后撤销该进程。因此,进程由创建到消亡是有一定生命期的,在生命期间,进程是一个活动实体。而程序是可以永久存放于某种介质上的有序指令集合,是一个静态实体。
(3)独立性:进程是一个能够独立运行的基本单位,即只有进程才能被独立调度运行及独立获得资源。在系统中,除了系统提供的服务外,只有进程在活动,而程序是不能作为调度运行和获得资源的基本单位的。
(4)异步性:这是指进程以各自独立的、不可预知的速度向前推进。这一特性基于进程的并发性,需要系统采取必要的措施,以保证各个进程的程序之间能协调运行。
(5)结构特征:进程实体中包含程序段、数据段,还必须有一个存放进程生命期间管理信息的数据结构——进程控制块PCB(Process Control Block)。进程控制块PCB能够保证进程并发执行及在生命期间进程活动的顺利进行。不同的进程是以PCB来区别的,不同的PCB代表不同的进程。
进程由3部分组成:进程控制块PCB、程序段和数据段,一个进程一经被创建,就有如下3部分内容。
(1)PCB表:为便于管理,PCB表被放在不同的队列或状态中。新建进程的PCB表被放在就绪队列中,根据进程在活动过程中所处的状态,PCB表可被放在就绪队列或阻塞队列中,也可以处于执行状态中。
(2)可执行的程序段:其首地址由PCB表中程序地址信息字段直接或间接指出。
(3)可加工的数据段:其首地址由PCB表中数据地址信息字段直接或间接指出。有的进程可以没有数据段。
进程控制块PCB是为描述进程动态变化过程及对进程进行控制与管理而设的数据结构。进程与PCB表一一对应,操作系统根据PCB表了解进程的存在,它是进程是否存在的唯一标志。
PCB表常驻内存,属于系统空间,只有操作系统程序才能够访问,用户程序不得访问。
进程的程序段反映了进程的功能,数据段是程序加工的对象,均属于用户空间。运行时可以根据需要全部地或者部分地放在内存中。进程处于非执行状态时,如果内存有剩余空间,它的程序段和数据段放在内存,如果内存无剩余空间,则可以放在外存。进程处于执行状态时,程序段与数据段必须有一部分放在内存,以方便执行。程序段和数据段在内存与外存中的物理地址是由PCB表的地址信息字段指明的。
进程有3个基本状态:就绪状态、执行状态与阻塞状态。进程的基本状态及其变迁如图3-3所示。进程在运行过程中必处于这3个基本状态之一。
图3-3进程的基本状态及其变迁图
(1)就绪状态:进程获得必要资源,已经具备了执行条件,只是没有空闲的CPU,处于等待CPU的状态。在系统中,将处于就绪状态的多个进程的PCB表排成一个队列,或按照某种规则排在不同的队列中,这些队列称为就绪队列。
(2)执行状态:进程已经获得必要的资源及CPU,它的程序正在执行中,这时进程的状态称为执行状态。在多处理机系统中,可以有多个进程处于执行状态。在单处理机系统中,只能有一个进程处于执行状态,系统应尽量保证一个CPU上总有一个处于执行状态的进程,使CPU得到充分的利用。处于此状态的进程的数目小于等于CPU的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的idle进程(相当于空操作)。
(3)阻塞状态:进程因某等待事件发生(例如I/O请求、某些原语操作等)而处于暂停执行的状态,此时即使将CPU分配给它,它的程序也无法执行。在系统中,将处于阻塞状态的进程的PCB表排成一个队列,或因阻塞原因不同而将进程的PCB表排在不同的队列中,这些队列称为阻塞队列。
进程控制是操作系统内核中的组成部分。在操作系统中有两类进程:系统进程和用户进程。进程控制是对系统中的所有进程实施有效的管理,主要完成创建进程、撤销进程及实现进程状态之间的转换等工作。
进程通信的类型以下有几种:
(1)共享内存储区。共享内存储区的通信模式是在内存中划出共享的存储区。多个进程可以通过对共享内存储区中数据的读操作和写操作完成进程之间的通信。
(2)管道。管道是外存上的一个共享文件,是一个单向的、先进先出的、固定大小的数据流。写进程向管道尾部写入数据,读进程从管道首端读出数据。管道空时,读进程被阻塞,管道满时,写进程被阻塞。管道提供了一种简单的流控制机制。
(3)消息机制。在消息机制中,进程之间数据交换以消息为单位。消息是一组可以传递的信息。通信的进程之间不存在共享的内存,而是由发送者执行发送命令,接收者执行接收命令,即完成了一次消息的传输。传输过程对用户是透明的,由操作系统完成。由于消息传输方式不同,可以分为直接通信方式与间接通信方式。
·直接通信方式:发送进程将消息直接发给接收进程,挂在接收进程的消息队列上,由接收进程从自己的消息队列上取下消息,完成一次消息的通信过程。
·间接通信方式:通信时指明一个中间媒介,即信箱。发送者执行发送命令,将消息发到指明的信箱,接收者执行接收命令时,从指定的信箱中接收消息。
进程有3个基本状态:就绪状态、执行状态和阻塞状态。对处于就绪状态的多个进程,按照一定的策略选出一个进程,使其从就绪状态转变为执行状态,真正获得CPU来运行其程序,而在某一给定时刻,决定哪个进程运行、运行多长时间及如何保证进程的运行,这是进程调度的主要功能。
进程调度有以下两种方式。
(1)非抢占方式:进程一旦获得CPU就一直执行,直到完成或发生某事件(如请求I/O服务、P操作等)而阻塞,其他的进程方可运行。这种调度方式简单,容易实现,但是一个进程的运行往往可能导致多数进程长期得不到服务,所以非抢占方式不适宜有多个竞争用户的通用系统使用。
(2)抢占方式:允许在逻辑上可执行的进程暂时放弃CPU。抢占方式的调度策略(如时间片轮转、优先级等)允许非执行进程在满足某种条件时抢占执行进程所占用的CPU。
进程调度的主要任务就是按照一定的调度算法从就绪队列中选出一个进程,把CPU分配给它。调度算法的选择与系统的设计目标和系统工作效率密切相关。例如,有的算法有利于系统资源的充分利用,有的算法有利于系统处理能力的充分发挥,有的算法有利于公平地响应用户的服务请求等。
下面我们介绍一些常用的调度算法。
(1)先来先服务(FCFS)算法。在先来先服务算法中,进程到达就绪队列时按先后顺序排队。选择进程去执行时,始终选队首进程。进程获得CPU后,直至执行完或发生某等待事件,才释放CPU。
(2)最短CPU执行期优先调度算法。最短CPU执行期优先调度算法的做法是:每次调度时,从就绪队列中找出下一个CPU执行期最短的进程优先调度。该调度算法的难点在于预测进程的下一个CPU执行期是很不容易的。
(3)优先级调度算法。在优先级调度算法中,每个进程被赋予一个整数,代表优先级。通常数值大的优先级低,数值小的优先级高。优先级调度算法分为静态优先级调度和动态优先级调度两种调度算法。
在静态优先级调度算法中,创建进程时,根据进程的情况或要求,赋予进程一个优先级,进程运行过程中优先级不再改变。每次调度时,就绪队列中优先级最高的进程被率先调度,同级的采用先来先服务(FCFS)。
在动态优先级调度算法中,创建进程时赋予进程一个优先级,进程在运行过程中优先级根据某种规则或者某种算法在发生变化。每次调度时,仍然是从就绪队列中选择优先级最高的进程率先调度,同级的采用先来先服务(FCFS)。
动态优先级的确定是首先在进程运行前被赋予一个优先数,然后在运行中根据进程等待时间的长短、执行时间的多少、输入与输出信息量的大小等通过计算得到新的优先级。
(4)时间片轮转法。时间片轮转法是一种简单而又公平的算法,使用最为广泛。在时间片轮转调度算法中,每个进程按先进先出的原则进入就绪队列,每次调度时,用执行指针指向就绪队列队首进程的PCB表,并将其摘下,重布现场,给以时间片q让其运行。在时间片轮转法中,时间片可以是固定大小的,这比较容易实现。也可以采用可变时间片轮转调度算法。例如,不同的工作时段根据进程数的多少计算出不同的时间片,或者根据进程优先级的不同给以不同的时间片。
(5)多级反馈队列轮转调度算法。进程按先后顺序进入不同优先级的就绪队列中,各队列中的进程获得的时间片长短不一样,每个队列按照同一个时间片轮转。通常高优先级队列获得的时间片较短,低优先级队列获得的时间片较长,以缓和低优先级队列中的进程不易获得调度而感到的不公平。调度时先调度高优先级队列中的进程,后调度低优先级队列中的进程,同级的采用FCFS。所谓反馈是指对于进程被调度运行一个时间片后未完成,将被排在比原来所在队列低一级的优先级队列中。