4.2 进程概念
4.2.1 进程的定义
对于并发执行的程序来说,它有时处于执行状态,但由于并发程序之间的相互制约关系,有时它需要等待某种共享资源,有时又可能要等待某些信息而暂运行不下去,只得处于暂停状态,而当使之停暂的因素消失后,程序又可以恢复执行。所以,并发程序执行时是这样停停走走地向前推进的。换言之,由于程序并发执行时的直接或间接的相互制约关系,将导致并发程序具有“执行——暂停——执行”的活动规律,即与外界发生了密切的联系,从而失去了封闭性。在这种情况下如果仍然使用程序这个概念,只能对它进行静止的、孤立的研究,不能深刻地反映它们活动的规律和状态变化。因此,人们引入了新的概念——进程,以便从变化的角度,动态地分析研究并发程序的活动。
进程,这是处理机活动的抽象。根据这一概念,就使“执行中的程序”这一概念在任何时候都是有意义的,而不论处理机在该时刻是否正在执行该程序的指令。这样,静态的程序和动态的进程便区分开来了。
进程的要领是 20 世纪 60 年初期,首先由麻省理工学院的 MULTICS 系统和 IBM 公司的 TSS/360 系统引入的。其后,有许多人对进程下过各式各样的定义。下面,仅列举几种比较能反映进程实质的定义。
●进程是这样的计算部分,它是可以和其他计算并行的一个计算。
●进程(有时称为任务)是一个程序与其数据一道通过处理机的执行所发生的活动。
●任务(或称进程)是由一个程序以及与它相关的状态信息(包括寄存器内容、存区域和链接表)所组成的。
●所谓进程,就是一个程序在给定活动空间和初始环境下,在一个处理机上的执行过程。
根据 1978 年在庐山召开的人画操作系统会议上关于进程的讨论,结合国外的各种观点,国内对进程这一概念作了如下描述:
进程,即是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
上述这些对进程的解释从本质上讲是相同,但各有侧重, 说明进程这一概念至今尚未形成公认的严格的定义。但是,进程已广泛而成功地被用于许多系统中,成为构造操作系统不可缺少的强力的工具。
进程和程序是既有联系又有区别的两个概念,它们的区别和关系如下:
①程序是指令的有序集合,其本身没有任何运行的含义,它是一个静态概念。而进程是程序在处理机上的一次执行过程,它是一个动态概念。程序可以作为一种软件资料长期保存,而进程则是有一定生命期的,它能够动态地产生和消亡。即进程可由“创建”而产生,由调度而执行,因得不到资源而暂停,以致最后由“撤消”而消亡。
②进程是一个能独立运行的单位,能与其他进程并行地活动。
③进程是竞争计算机系统有限资源的基本单位,也是进行处理机调度的基本单位。
④同一程序同时运行于若干不同的数据集合上,它将属于若干个不同的进程。或者说,若干个不同的进程可以包含相同的程序。这句话的意思是:用同一程序对不同的数据先后或同时加以处理,就对应于好几个进程。例如,系统具有一个输入子程序,当它输入不同的作业时就形成了输入进程 I 1 、 I 2 、…、 I n 。
读者稍加留心就可以看出:进程和前面提到的计算有相似之处,它们都是程序的动态执行过程,从这一点上讲它们是一样的。但是,由于用进程描述操作系统的内部活动比较准确、清晰,所以都用进程这一概念来设计操作系统。
4.2.2 进程的类型
系统中同时存在许多进程,它们依性质不同可分为各种不同的类型。
有些进程起着资源管理和控制的作用,称之为系统进程,而另一些是为用户算题任务而建立的进程称为用户进程。它们是有区别的。
①系统进程被分配一个初始的资源集合,这些资源可为它所独占,也可以最高优先权的资格优先使用。用户进程通过系统服务请求的手段竞争系统资源。
②用户进程不能做直接 I/O 操作,而系统进程可以做显示的、直接的 I/O 操作。
③系统进程在管态下活动,而用户进程在目态下活动。
另外,进程还可以根据其活动特点来分类。有一类进程在其活动期间,大部分时间是进行计算工作,需要使用 CPU ,即这类进程的活动是受 CPU 时间限制的。而另一进程的活动则受 I/O 限制,在其活动期间需要进行大量的 I/O 工作,即这类进程的大部分活动时间取决于外设的 I/O 时间。例如,科学计算任务往往要求较多的 CPU 时间,但 I/O 信息较少;而数据处理问题正好相反,要求较少的 CPU 时间,而要求大量的 I/O 信息。
4.2.3 进程的状态
(一)进程的基本状态
前面已经介绍过,进程有着“执行—暂停—执行”的活动规律。一般说业,一个进程并不是自始至终一口气运行到底的,它与并发执行中的其他进程的执行是相互制约的。它有时处于运行状态,有时又由于某种原因而暂停运行处于等待状态,当使它暂停的原因消失后,它又可准备运行了。所以,在一个进程的活动期间至少具备三种基本状态,它们是:运行状态、就绪状态、等待状态(又称阻塞状态)。
①就绪状态( ready ):存在于处理机调度队列中的那些进程,它们已经准备就绪,一旦得到 CPU 控制权,就立即可以运行,这些进程所处的状态为就绪状态。
②运行状态( running ):当进程由调度 / 分派模块分派后,得到中央处理机控制权,它的程序正在运行,该进程所处的状态为运行状态。
③等待状态( wait ):若一进程正在等待着某一事件发生(如等待输入输出操作的完成)而界时停止执行,这时,即使给它 CPU 控制权,它也无法执行,则称该进程处于等待状态,又可称为阻塞状态。
对于一个实际的系统,在进程活动期间至少要区分出就绪、运行、等待这三种状态来。大能为每个进程提供一台处理机,则系统中所有进程都可以同时执行,但实际上处理机的数目总是少于时程数,因此,往往只有少数几个进程(在单处理机系统中,则只有一个进程)可真正获得处理机控制权。我们把那些获得处理机控制权的进程所处的状态称为运行状态,把那些希望获者处理机控制权,但因处理机数目太少而暂时分配不到处理机的进程所处的状态称为就绪状态。虽然所有进程并发执行,但它们之间并不完全独立,而是相互制约的,有的进程因种原因暂时不能运行而处于等待状态。因此,在任何系统中,必须有这几种基本状态。当然,有的系统较为复杂,还可设置更多的进程状态,且对每一种状态还可进一步细分。例如,等待状态可能包含子状态,如主存等待、文件等待或设备等待。这样细分和设置更多的状态需增加提供的模块的大小,增加系统的复杂性和常常要求大的系统开销。多数实时系统注意简化状态结构,以使调度和分派简单、高效。
(二)进程状态变迁图
进程并非固定处于某个状态,它将随着自希的推进和外界条件的变化而发生变化。对于一个系统,何以用一张进程状态变迁图来说明系统中每个进程可能具备的状态,以及这些状态这间变迁的可能原因。在进程状态变迁图中,以结点表示进程的状态,以箭头表示状态的变化。一个最简单的状态变迁图如图 4.8 所示。从图中可以看出状态之间的演变以及它们相互转换的典型理由。
值得注意的是,处于运行状态的进程因请求某种服务而变为等待状态,但当该请求完成后,等待状态的进程并不能恢复到运行状态,它通常是先转变为就绪状态,再重新由调度程序来调度。其原因请读者考虑。
上面介绍了进程的三个基本状态及状态的转换。那么,进程是如何产生和消亡的呢?进程是程序的一次执行过程,它是一个活动。当用户或系统需要一个活动时,可以通过创建进程的方法来产生一个进程。进程被创建后进入就绪状态。而当一个进程的任务完成时,可以通过撤消进程的方法使进程消亡。
4.2.4 进程的描述——进程控制块
为适应并发程序设计的需要而引入了进程的概念。进程是程序的一次执行过程。程序是完成该进程操作的算法描述,它是静止的概念。当某程序和另的程序并发执行时,产生了动态特征,并由于并发程序之间的相互制约关系而造成了比较复杂的一个外界环境。为了描述一个进程和其他进程以及系统资源的关系,为了刻画一个进程在各个不同时期所处的状态,人们采用一了个与进程相联系的数据块,称为进程控制块 pcb(process control block) 或称为进程描述器( process descriptor )。系统根据 pcb 而感知进程的存在,故 pcb 是标识进程存在的实体。当系统创建一个进程时,必须为它设置一个 pcb ,然后根据 pcb 的信息对进程实施控制管理。进程任务完成时,系统撤消它的 pcb ,进程也随之消亡。
从结构上说,每个进程都由一个程序段(包括数据)和一个进程控制块 pcb 组成。为了对进程作充分的描述, pcb 通常应具有的信息如表 4.1 所示。
表中各项内容说明如下:
①进程标识符 name :每个进程都必须有唯一的标识符,可以用字符或编号表示。在创建一个进程时,由创建者给出进程的标识符。
②进程当前状态 status :说明本进程目前处于何种状态(运行、就绪、等待),作为进程调度时分配处理机的主要依据。只有当时程处于就绪状态时,才有可能获得处理机。当某个进程处于等待状态时,有时要在 pcb 中说明等待的原因。
为了便于对进程实施管理,通常把具有相同状态的进程链在一起,组成各种队列。比如,将所有处于就绪状态的进程链在一起,称为就绪队列。把所有因等待某事件而处于等待状态的进程链在一起就组成各种等待(或阻塞)队列。而运行链在单处理机系统中则只有一个运行指针( running )。进程当前后状态可以用进程所属的当前队列头指针( current-q-start )如某进程正处于就绪状态,我们以就绪队列头指针 ready-q-start 表示;若进程因某事件(设为 x )而等待,则以 wait-x-q-start (等待 x 事件的队列头指针)来表示。
③当前队列指针 next :该项登记了处于同一状态的下一个 pcb 的地址,以此将处于同一状态瓣所有进程勾链起来。每个队列有一个队列头,其内容为队列第一个元素的地址。一般队列头由操作系统掌握。
图 4.9 描述了一个就绪队列和一个等待打印机队列的结构。
   
图 4.9 就绪队列和等待队列
④总链指针 all-q-mext :系统中存在着大量的进程,它们依各自的状态分别处于相应的队列中,这便于进程实施调度控制。但是,当进行某些管理功能,如执行创建新进程的功能时,就感到系统具有所有进程的总链将是十分方便的。因为进程的标符必须是唯一的,由创建者给出的被创建进程的名字是否会重名,必须先检查系统已有的进程名,但若分别在各个队列去查询将是十分麻烦的,所以,应提供一个进程总链结构。进程 pcb 中的该项内容是指向总链中的下一个 pcb 地址。
⑤程序开始地址 start-addr :该进程的程序将从此地址开始执行。
⑥进程优先级 priority :进程优先级反映了时程要求 CPU 的紧迫程度,它通常由用户预先提出或由系统指定。进程将以其优先级的高低去争夺使用 CPU 的权利。
⑦ CPU 现场保护区 cpustatus :当进程由于某种原因释放处理机时, CPU 现场信息被保护在 pcb 的该区域中,以便在该进程重新获得处理机后有继续执行。通常被保护的信息有:工作寄存器、指令计数器以及程序状态字高等。
⑧通信信息: communication information: 是指每个进程在运行过程中与别的进程进行通信时所记录的有关信息。比如,可以包含正等待着本进程接收的消息个数,第一个消息的开始地址等。
⑨家族联系 process family :有的系统允许一个进程创建自己的子进程,这样,会组成一个进程家族。在 pcb 中必须指明本进程与家庭的联系,如它的子进程和父进程的标识符。
⑩占有资源清单 own-resoruce 。
不同的操作系统所使用的 pcb 结构是不同的。对于简单系统, pcb 结构较小。而在一些较复杂的系统中, pcb 所含的内容则比较多,比如,还可能有关于 I/O 、文件传输、覆盖管理等控制信息。但是,一般 pcb 应包含的最基本内容正如表 4.1 所示。 |