1、第3章 进程管理,3.1 引言3.2 进程的引入和定义3.3 进程的状态和进程控制块3.4 进程控制3.5 线程的基本概念3.6 进程调度3.7 进程通信3.8 死锁问题,http:/ 引言,处理机管理是操作系统的基本管理功能之一,它所关心的是处理机的分配问题。也就是说把CPU(中央处理机)的使用权分给某个程序,通常把这个正准备进入内存的程序称为作业,当这个作业进入内存后我们把它称为进程。处理机管理分为作业管理和进程管理两个阶段去实现处理机的分配,常常又把直接实行处理机时间分配的进程调度工作作为处理机管理的主要内容。 进程管理的主要功能是把处理机分配给进程以及协调各个进程之间的相互关系。它是由
2、进程调度程序和进程控制(控制进程状态转换)程序这两部分内容组成的。,返回首页,3.2 进程的引入和定义,3.2.1 进程的引入3.2.2 进程的定义,返回首页,3.2.1 进程的引入,1程序的顺序执行及其特性2资源共享3程序的并发执行及其特性,1程序的顺序执行及其特性,图3.1表示每次仅能调度一个用户作业进行操作的先后次序。输入、计算和打印输出工作只能串行执行,我们可以把程序的执行过程看作是一系列状态转变过程,每执行一个操作,系统就从一种状态变成另一种状态。图中I表示输入操作,P表示处理操作,O表示输出操作。,图3.1 顺序处理操作的先后次序,由上述顺序程序的执行情况可以看出,一切顺序执行的程
3、序都具有下列特性:(1)顺序性。程序在处理机上执行时,其操作只能严格地按照所规定的顺序执行,后继操作只有在前一操作执行完毕之后方能执行,否则就会发生程序逻辑错误。(2)资源独占。程序在执行过程中独占全部资源,资源状态的改变只与程序本身有关,而与外界环境无关。(3)结果的无关性。第一,指程序执行的结果与其执行速度无关。第二,是指只要程序的初始条件不变,当重复执行时,一定能得到相同的结果。,2资源共享,操作系统是用来实现对计算机资源进行管理的一个大型系统程序,其基本特征之一就是资源共享。这里的资源就是指计算机处理一个任务或一个作业时的所有硬设备(处理机、内存、外存、输入/输出设备等)和软设备(文件
4、、程序、数据、信息等)的总称。所谓资源共享,就是指计算机中并发执行的多个程序交替使用计算机硬件和软件资源。操作系统提供了两种实现资源共享的方法 。(1)由操作系统统一管理和分配。(2)由进程自行使用。,图3.2 并行计算的先后次序,3程序的并发执行及其特性,在大多数计算问题中,仅要求操作在时间上是部分有序的。有些操作必须在其他操作之后执行,另外有些操作却可以并行地执行。如图3.2所示,其先后次序是:I1先于P1和I2;P1先于O1、P2和I3;O1先于O2,P3部分有序使某些操作的并行执行成为可能,如I2和P1,I3,P2与O1等操作的执行可以在时间上互相重叠。通常,程序的制约方式有如下两种。
5、 (1)间接制约方式。 (2)直接制约方式。,无论是操作系统自身的程序还是用户程序,通常总是存在一些相对独立、但又能并发执行的程序段。 为了合理利用系统资源,更好地发挥各种资源的效益,使各种物理设备之间的时间性限制条件减少到最低限度,最大限度地提高系统的效率,因而引出了多道程序方法。其实质是减少程序的顺序性,提高系统的并行性。,返回本节,3.2.2 进程的定义,。进程是现代操作系统的一个基本概念,是并发程序出现后出现的一个重要概念,它是指程序在一个数据集合上运行的过程,是系统进行资源分配和调度运行的一个独立单位,有时也称为活动、路径或任务。进程,作为程序执行的过程,至少有两个方面的性质:一是它
6、的活动性,即进程是动态变化的,且总有一个从创建到消亡的过程;二是它的并发性,即多道程序中每个进程的执行过程,总是与其他执行过程并发执行的。,进程与程序的区别和相互关系 :(1)动态性和静态性。 (2)从结构上看每个进程的实体都是由程序段和相应的数据段两部分构成的,这一特征与程序的含义相近。 (3)一个进程可以涉及到一个或几个程序的执行 。(4)并发性。 (5)进程具有创建其他进程的功能。 (6)操作系统中的每一个程序都是在一个进程现场中运行的。,进程通常分为两类,一类是系统进程,另一类是用户进程。它们的区别是:(1)系统进程是操作系统用来管理系统资源并行活动的并发软件。 (2)系统进程之间的关
7、系由操作系统自己负责。 (3)系统进程直接管理有关的软、硬设备的活动。(4)在进程调度中,系统进程的优先级高于用户进程。,返回本节,3.3 进程的状态和进程控制块,3.3.1 进程的状态及状态变化图3.3.2 进程的结构、进程控制块及组织方式,返回首页,3.3.1 进程的状态及状态变化图,(1)运行状态:进程正在处理机上运行的状态,该进程已获得必要的资源,也获得了处理机,用户程序正在处理机上运行。(2)阻塞状态:进程等待某种事件完成(例如,等待输入/输出操作的完成)而暂时不能运行的状态,处于该状态的进程不能参加竞争处理机,此时,即使分配给它处理机,它也不能运行。(3)就绪状态:该进程运行所需的
8、一切条件都得到满足,但因处理机资源个数少于进程个数,所以该进程不能运行,而必须等待分配处理机资源,一旦获得处理机就立即投入运行。,图3.3 典型的进程状态演变图,在具有挂起和激活的系统中,又增加了两种基本的进程状态:静止就绪和静止阻塞。 (1)静止就绪:它是活动就绪进程由其自身或其他进程调用挂起原语而进入的一种状态。处于静止就绪状态的进程没有资格争用CPU,只有其他进程调用激活原语将其激活才行。(2)静止阻塞:它是活动阻塞进程由其自身或其他进程调用挂起原语而进入的一种状态。处于静止阻塞状态的进程,在其挂起期间并不影响其等待事件的发生。图3.4是具有静止状态的进程状态变迁图。,图3.4 具有静止
9、状态的进程状态变迁图,返回本节,3.3.2 进程的结构、进程控制块及组织方式,1进程的结构进程都是由一系列操作(动作)所组成,通过这些操作来完成其任务。因此,不同的进程,其内部操作也不相同。在操作系统中,描述一个进程除了需要程序和私有数据之外,最主要的是需要一个与动态过程相联系的数据结构,该数据结构用来描述进程的外部特性(名字、状态等)以及与其他进程的联系(通信关系)等信息,该数据结构称为进程控制块(PCB,Process Control Block)。,图3.5 进程的结构,2进程控制块PCB及组织方式(1)进程控制块PCB进程控制块跟踪程序执行过程中的状态,它们表达了进程在当前时刻的状态以
10、及它与其他进程和资源的关系。进程控制块是进程存在的标志,当系统或父进程创建一个进程时,实际上就是为其建立一个进程控制块。进程控制块不但指出了进程的名字,而且也标志出程序和数据集合的物理位置 。,图3.6 进程控制块的基本内容,(2)进程控制块PCB的组织方式 1)线性表方式:不论进程的状态如何,将所有的PCB连续地存放在内存的系统区。这种方式适用于系统中进程数目不多的情况。 2)索引表方式:该方式是线性表方式的改进,系统按照进程的状态分别建立就绪索引表、阻塞索引表等。 3)链接表方式:系统按照进程的状态将进程的PCB组成队列,从而形成就绪队列、阻塞队列、运行队列等。,返回本节,3.4 进程控制
11、,3.4.1 原语3.4.2 进程控制原语,返回首页,3.4.1 原语,原语通常由若干条指令所组成,用来实现某个特定的操作。通过一段不可分割的或不可中断的程序实现其功能。原语是操作系统核心,它不是由进程而是由一组程序模块所组成,是操作系统的一个组成部分,它必须在管态(一种机器状态,管态下执行的程序可以执行特权和非特权两类指令,通常把它定义为操作系统的状态)下执行,并且常驻内存,而个别系统有一部分不在管态下运行。,图3.7 进程家族示例,返回本节,3.4.2 进程控制原语,1创建原语2撤消原语3阻塞原语4唤醒原语5挂起原语6激活原语,返回本节,3.5 线程的基本概念,3.5.1 线程的引入3.5
12、.2 线程与进程的关系 3.5.3 线程的类型,返回首页,3.5.1 线程的引入,(1)创建进程。系统在创建进程时,必须为之分配其所必需的、除处理机以外的所有资源。如内存空间、I/O设备以及建立相应的PCB结构。(2)撤消进程。系统在撤消进程时,又必须先对这些资源进行回收操作,然后再撤消PCB结构。(3)进程切换。在对进程进行切换时,由于要保留当前进程的CPU环境和设置新选中进程的CPU环境,为此需花费不少处理机时间。,返回本节,3.5.2 线程与进程的关系,1调度2并发性3拥有资源4系统开销,返回本节,3.5.3 线程的类型,1线程的调度与切换速度2系统功能调用3线程执行时间,线程已在许多系
13、统中实现,但实现的方式并不完全相同。在有的系统中,特别是一些数据库管理系统如Informix,实现的是用户级线程(User-Level-Threads),这种线程不依赖于内核。而另一些系统(如Mach和OS/2操作系统)实现的是内核支持线程(Kernel-Supported- Threads),这种线程依赖于内核。还有一些系统如Solaris操作系统,则同时实现了这两种类型的线程。,返回本节,3.6 进程调度,3.6.1 进程调度的职能3.6.2 进程调度所用的主要数据结构3.6.3 进程调度的方式3.6.4 进程调度算法 3.6.5 综合的调度策略调度用的进程状态切换图,返回首页,3.6.1
14、 进程调度的职能,(1)记录系统中所有进程的有关情况。 (2)确定分配处理机的原则。 (3)分配处理机给进程。 (4)从进程收回处理机。引起进程调度的原因不仅与操作系统的类型有着密切的关系,而且还与下列因素有关:正在运行的进程运行完毕;运行中的进程要求I/O;执行某种原语操作;一个比正在运行进程优先数更高的进程申请运行(在可剥夺调度方式下);分配给运行进程的时间片已经用完等。,返回本节,3.6.2 进程调度所用的主要数据结构,通过3.3.2节的学习我们知道操作系统对进程的管理具体体现在对进程的PCB的管理。同时也了解到进程控制块PCB的几种组织方式:线性表方式、索引表方式和链接表方式。一般情况
15、下,进程控制块PCB的组织方式采用的是链接表方式。因此,在进程调度中所用的主要数据结构是队列(PCB的链接方式在这里就不详细介绍了,若需要请详见3.3.2节),返回本节,3.6.3 进程调度的方式,进程调度的方式可分为非剥夺式和剥夺式。剥夺式调度是指当系统按照某种原则发现一个比现运行进程更合适、更应该占用CPU的进程时,系统将强迫处于运行状态的进程将CPU的使用权交给这个更适合的进程。 非剥夺式调度是指一旦某个进程占用了CPU,除非是由于它自身原因自动放弃CPU,否则它将一直运行下去直到完成。,返回本节,3.6.4 进程调度算法,1先来先服务2轮转调度3分级轮转法4优先数法,进程调度的主要问题
16、就是采用某种算法合理有效地把处理机分配给进程,其调度算法应尽可能提高资源的利用率,减少处理机的空闲时间。对于用户作业采用较合理的平均响应时间,以及尽可能地增强处理机的处理能力,避免有些作业长期不能投入运行。这些“合理的原则”往往是互相制约的,甚至是矛盾的,难以全部达到要求。,进程的优先数是根据什么条件确定的,这是一个很重要的问题,通常应考虑如下几个因素: (1)进程类型。根据不同类型的进程确定其优先数。 (2)运行时间。通常规定进程优先数与进程所需运行时间成反比,即运行时间长的(一般占用内存也较多)大作业,分配给它的优先数就越低,反之则越高。 (3)作业的优先数。根据作业的优先数来决定其所属进
17、程的优先数。 (4)动态优先数。,时间片的长短由如下四个因素决定:(1)系统的响应时间。当进程数目一定时,时间片的长短直接影响系统的响应时间。(2)就绪队列中进程的数目。这与前面的问题正好相反,即当系统对响应时间要求一定时,时间片长则就绪队列中进程数应少,反之亦然。(3)进程状态转换(即进程由就绪到运行,由运行到就绪)的时间开销。(4)计算机本身的处理能力。执行速度和可运行作业的道数。,返回本节,3.6.5 综合的调度策略调度用的进程状态切换图,我们采用进程状态切换图来帮助大家进一步了解进程调度算法。以分级轮转法为例,将就绪进程分成高优先数和低优先数两个队列。如果进程运行中超过了规定的时间片就
18、进入低优先数队列,而I/O操作完成的进程,即由阻塞状态进入高优先数就绪队列。如图3.8所示,其调度算法是:首先从高优先就绪队列中选择一个进程来运行,如果在高优先数就绪队列中没有进程,则从低优先数就绪队列中选择一个进程运行。,图3.8 调度用的进程状态切换图,返回本节,3.7 进程通信,3.7.1 进程互斥3.7.2 互斥用的硬件机制3.7.3 进程同步3.7.4 用信号量实现进程同步 3.7.5 两个经典的同步/互斥问题 3.7.6 结构化的同步/互斥机制管程3.7.7 进程的通信方式之二消息缓冲,返回首页,3.7.1 进程互斥,几个进程若共享同一临界资源,它们必须以互斥的方式使用这个临界资源
19、,即当一个进程正在使用临界资源且尚未使用完毕时,则其他进程必须推迟对该资源的进一步操作,在当前进程的使用完成之前,不能从中插进去使用这个临界资源,否则将会造成信息混乱和操作出错。系统中同时存在有许多进程,它们共享各种资源,然而有些资源每次只能让一个进程所使用。临界区是一个进程访问临界资源的那段程序代码。有了临界资源和临界区的概念,进程间的互斥可以描述为禁止两个或两个以上的进程同时进入访问同一临界资源的临界区。,返回本节,3.7.2 互斥用的硬件机制,下面我们不局限于某特定系统,定义TS指令为:function TS(var lock:boolean):boolean;begin TS:=loc
20、k; lock:=true; end,用TS指令实现互斥的循环进程可描述如下:repeat while TS(lock) do skip; critical section; lock:=false; remainder section;until false,返回本节,3.7.3 进程同步,并发执行的多个进程,看起来好像是异步前进的,彼此之间都可以互不相关的速度向前推进,而实际上每一个进程在其运行过程中并非相互隔绝。一方面它们相互协作以达到运行用户作业所预期的目的,另一方面它们又相互竞争使用系统中有限的资源。两个并行的进程A、B,如果当A进行某个操作时,B不能做这一操作,进程间的这种限制条件
21、称为进程互斥,引起资源不可共享的原因:一是资源的物理特性所致;二是某些资源如果同时被几个进程使用,则一个进程的动作可能会干扰其他进程的动作。,返回本节,3.7.4 用信号量实现进程同步,1lock和unlock大部分同步方案均采用某个物理实体(如锁、信号灯等)实现通信,进程通信原语中关锁(lock)和开锁(unlock)是最简单的原语。在这两个原语中设置一个公共变量x代表某个临界资源的状态。 进程使用临界资源必须作如下三个不可分割的操作:(1)检查x的值。(2)进入临界区,访问临界区资源。(3)释放临界区资源,置x为0(开锁)。,图3.9 开锁和关锁程序流程图,2P/V操作设s1、s2初值为0
22、,用PV操作实现上述同步模型如下:,返回本节,3.7.5 两个经典的同步/互斥问题,1生产者与消费者问题Dijkstra把广义同步问题抽象成一种“生产者与消费者问题”(Producer-consumer-relationship)的抽象模型。 2读者与写者问题一个数据对象(比如一个文件或记录)若被多个并发进程所共享,且其中一些进程只要求读该数据对象的内容,而另一些进程则要求修改它,对此,可把那些只想读的进程称之为“读者”;而把要求修改的进程称为“写者”。,下面给出基于环形缓冲区的生产者与消费者关系的形式描述,设:(1)公用信号量mutex:初值为1,用于实现临界区互斥。(2)生产者私用信号量e
23、mpty:初值为n,指示空缓冲块数目。(3)消费者私用信号量full:初值为0,指示满缓冲块数目。(4)整型量i和j初值均为0,i指示首空缓冲块序号,j指示首满缓冲块序号。,Var mutex,empty,full:semaphore;i,j:integer;buffer:array 0n一1 of item;Procedure producer; 生产者进程 begin while true do begin produce a product; P(empty); P(mutex); Buffer (i):Product; i:(i+1) mod n; V(mutex); V(full);
24、 end end;procedure consumer; 消费者进程,begin while true do begin P(full); P(mutex); goods:buffer(j); j:(j+1) mod n; V(mutex); V(empty); Consume a product; end end;beginseminitial ;i:j:0;cobeginproducer;consumer;Coendend,下面给出读者进程与写者进程的一般结构。,var mutex, wrt: semaphore;readcount: integer;begin seminit ;read
25、count:=0cobeginprocedure reader;beginP(mutex);readcount:=readcount+1;If readcount=1 then P (wrt);V(mutex);reading is performing;,P(mutex);readcount:=readcount-1if readcount=0 then V(wrt);V (mutex);end procedure writer;begin P(wrt);writing is performing;V(wrt);endcoendend;,返回本节,3.7.6 结构化的同步/互斥机制管程,建立
26、管程的基本理由是:由于对临界区的执行分散在各进程中,这样不便于系统对临界资源的控制和管理,也很难发现和纠正分散在用户程序中的对同步原语的错误使用等问题。为此,应把分散的各同类临界区集中起来。并为每个可共享资源设立一个专门的管程来统一管理各进程对该资源的访问。这样既便于系统管理共享资源,又能保证互斥访问。,管程主要由两部分组成:(1)局部于该管程的共享数据,这些数据表示了相应资源的状态。(2)局部于该管程的若干过程,每个过程完成关于上述数据的某种规定操作。,例如,对并发PASCAL编译程序在编译源程序时,对每一个形如:monitorname.procedure/functionentryname
27、的调用语句,都将自动保证其按如下方式执行:P(mutex);执行相应的过程或函数:V(mutex);其中,mutex是关于相应管程的互斥信号灯,初值为1。,前面我们曾给出了利用信号灯及其P、V操作实现的生产者与消费者共享环形缓冲池的同步模型,这里再以环形缓冲池为例,给出环形缓冲池的管程结构。monitor ringbuffer;var rbuffer:array0n-1 of item;k, nextempty, nextfull: integer;empty, full: condition;procedure entry put (var product:item);begin if k=
28、n wait (empty);rbuffer nextempty: product;k:=k+1;nextempty:=(nextempty+1) mod n;,signal (full);end;procedure entry get (var goods:item);begin if k =0 wait (full);goods:=rbuffer nextfull;k:=k-1;nextfull:=(nextfull+1) mod n;signal (empty);end;begink:=0;nextempty:=0;nextfull:=0;end;,管程ringbuffer包含两个局部过
29、程:过程put负责执行将数据写入某个缓冲块的操作;过程get负责执行从某个缓冲块读取数据的操作。empty和full定义为两个条件变量,对应于缓冲池满和缓冲池空条件等待队列。任一进程都必须通过调用管程ringbuffer来使用环形缓冲池,生产者进程调用其中的put过程,消费者进程调用get过程。在利用管程解决生产者、消费者问题时,其中的生产者和消费者可描述为:,producer:begin repeat produce an item; ringbuffer. put(item); until false; endconsumer:begin repeat ringbuffer. get (i
30、tem); consume the item; end,返回本节,3.7.7 进程的通信方式之二消息缓冲,两个并发进程可以通过互相发送消息进行合作,消息是通过消息缓冲而在进程之间互相传递的。所谓消息是指进程之间以不连续的成组方式发送的信息,而消息缓冲区则是包含有指向发送进程的指针、指向消息接收进程的指针、指向下一个消息缓冲区的指针、消息长度、消息内容等信息的一个缓冲区。这个缓冲区就构成进程通信的一个基本单位。当进程需要发送消息时,就构成这样一个缓冲区,并发送给指定的接收进程。 1SEND(A)(发送消息)原语2READ(A)(读取消息)原语,1SEND(A)(发送消息)原语,发送消息原语被进程
31、用于把消息发送到存放消息的缓冲区。A是原语的参数,表示发送区的地址。其工作原理是:首先调用“寻找目标进程的PCB”的程序查找接收进程的PCB,如果接收进程存在,申请一个存放消息的缓冲区,消息缓冲区为空时,接收此消息的进程因等待此消息的到来而处于阻塞状态,则唤醒此进程,并把消息的内容、发送原语的进程名和消息等,复制到预先申请的存放消息的缓冲区,且将存放消息的缓冲区连接到接收进程的PCB上;如果接收进程不存在,则由系统给出一个“哑”回答;最后控制返回到发送消息的进程继续执行,或转入进程调度程序重新分配处理机。如图3.11所示。,图3.11 发送消息过程流图,2READ(A)(读取消息)原语,REA
32、D(A)原语用来读取消息,接收进程读取消息之前,在自己的空间中确定一个接收区。当接收进程想要读取消息时,使用READ(A)原语,A是接收进程提供的接收区开始地址。如图3.12所示。,图3.12 读取消息,返回本节,3.8 死锁问题,3.8.1 死锁产生的原因和必要条件3.8.2 预防死锁 3.8.3 避免死锁3.8.4 检测与解除死锁,返回首页,3.8.1 死锁产生的原因和必要条件,在许多中型和大型计算机系统中,都期望在各级系统和用户程序上具有动态共享资源、并发程序设计及进程通信这些操作特征,来改善系统资源的利用率和提高系统的处理能力。由于资源的占用往往是互斥的,因此当某个进程提出申请资源后,
33、使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊的现象死锁。,先来看一个申请不同类型资源的死锁例子,假定有两个进程Pl和P2都要修改文件F,修改时都需要一条暂时存放信息的磁带,而只有一台磁带机T可用。又假定由于某种原因,在进行修改之前,P2需要一暂存磁带(例如为了修改,要重新组织输入数据)。设F和T都是可重用资源,它们分别表示允许更新文件和允许使用磁带机。于是Pl和P2可有如下形式:,进程P1 进程P2 : : 申请文件F 申请磁带机T r1:申请磁带机T r2:申请文件F 释放磁带机T 释放文件F 释放文件F 释放磁带机T ,图3.13 简单的死锁例子,图
34、3.14 同类资源共享时的死锁现象,由以上诸例子可知,产生死锁现象的原因,一是系统提供的资源不能满足每个进程的使用;二是在多道程序运行时,进程推进顺序不合理。产生死锁有四个必要条件:(1)互斥条件。 (2)不剥夺条件。 (3)请求和保持条件。 (4)环路等待条件。,返回本节,3.8.2 预防死锁,1破坏“请求与保持条件”2破坏环路条件3资源受控动态分配,图3.15 资源申请和释放顺序图,返回本节,3.8.3 避免死锁,避免死锁是指通过某种算法,当系统分配资源时始终能作出是否分配的正确选择,从而避免死锁。目前运用的避免死锁的算法是E.W.Dijkstra提出的银行家算法。银行家算法的数据结构包括
35、:可用资源向量Available 最大需求矩阵Max分配矩阵Allocation需求矩阵Need,银行家算法如下:设Requesti是进程Pi的请求向量,Requesti (j)=k表示进程Pi请求分配Rj类资源k个,当Pi发出资源请求后,系统按照下列步骤进行检查。(1)若RequestiNeed,则执行步骤(2);否则系统会因为它所需要的资源数已超过它要求的最大值而认为出错。(2)若RequestiAvailable,则执行步骤(3);否则系统会因为系统中尚无足够的资源满足Pi的申请而使进程Pi等待。,(3)系统试探地把资源分配给进程Pi并修改如下数据结构中的值:Available=Avai
36、lable-RequestiAllocationi=Allocationi+RequestiNeedi=Needi-Requesti(4)系统执行安全算法,检查此次资源分配后,系统是否处于安全状态。若是则系统才真正将资源分配给进程Pi以完成本次分配;若不是则系统将试探分配作,系统所执行的安全性算法描述如下: (1)设置两个向量:Work和Finish。 (2)从进程集合中找到一个能满足下述条件的进程: Finish(i)=false NeediWork(3)当进程Pi获得资源后可顺利执行直到完成,然后释放分配给它的资源,并作如下工作: Work=Work+Allocation Finish(i
37、)=true(4)若所有进程的Finish(i)的值都为true,则说明系统处于安全状态;否则系统处于不安全状态。,返回本节,3.8.4 检测与解除死锁,1检测死锁2解除死锁,1检测死锁上面讨论了预防和避免死锁发生的几种方法,但这些方法都比较保守,且都是以牺牲机器效率和浪费资源为代价的,这恰与操作系统的宗旨相违背,如果我们采取较为大胆的方法,即允许死锁发生,但操作系统能不断地监督进程的共同进展路径,判定和发现死锁,一旦死锁发生,采取专门的措施加以克服,并以最小的代价使系统恢复正常,这正是我们所希望的。,表3.1 资源分配表S,表3.2 进程等待表W,其发现死锁的算法如下:(1)把末阻塞(Ci0
38、)的进程Pi记录在L表中(其全部资源请求已得到满足的进程)。(2)从L表中选择一进程,根据资源分配表S释放分配给该进程的所有资源。(3)由进程等待表W依次检查和修改需要该进程释放资源的每一个进程的等待计数器Cj。(4)若Cj0,则表示该进程所请求的资源已得到满足,不再阻塞,将Pj记入L表中。(5)再从L表中选取另一进程,重复上述操作。(6)若所有的进程都记入L表中,则系统初始状态为非死锁状态,否则为死锁状态。,2解除死锁,(1)资源剥夺法。1)还原算法。即恢复计算结果和状态。2)建立检查点主要是用来恢复分配前的状态。 (2)撤消进程法。1)程序的优先数,即被撤消进程的优先数。2)作业类的外部代价 3)运行代价,即重新启动它并运行到当前撤消点所需要的代价。,返回本节,本章小结,本章内容是本教材的重点和难点,主要讲述程序并发执行及特点、进程的定义、进程的状态及演变方式、进程控制块及作用;进程的互斥与同步及其区别与联系,并着重介绍运用操作系统提供的同步机构实现进程间的互斥与同步,解决经典的进程同步问题;讨论了进程间的直接通信;理解操作系统的微观调度进程调度,掌握进程调度的常用调度算法及根据调度用的进程状态演变图分析进程状态演变的原因及调度效果;对死锁问题,重点是死锁的定义、产生的原因、必要条件及死锁的预防和避免。,返回首页,