目录
学习建议:
基本内容:
一、死锁的形成:
二、死锁的必要条件:
三、资源分配图:
四、解决死锁问题的几个策略:
五、死锁的防止:
1.互斥条件:
2.占有并等待资源:
3.不可抢夺资源:
4.循环等待条件:
5.一种按需分配策略:
本章小结:
解决死锁问题可以有3种方式:
(1)死锁的防止:
(2)死锁的避免:
(3)死锁的检测:
同步练习:
学习建议:
本章的内容关键在于理解,理解"死锁"影响系统的可靠性。死锁的产生与进程对资源的需求、进程的执行速度、资源的分配策略有关。系统应采用一定的策略实现资源分配以保证系统的安全。 在上一章中谈到的PV操作等都可能会引起死锁的产生。理解死锁产生四个必要条件,以及预防死锁、避免死锁、检测死锁和解除死锁的各种方法。理解和掌握银行家算法的原理和实现。其中重点是:死锁的防止和避免。
基本内容:
一、死锁的形成:
在系统中一生死锁,就会使整个系统瘫痪而无法正常工作,或一直作空操作,操作员却很难发现,从而饥时的很大浪费。因此,死锁问题自提出后就引起许多人注意,成为操作系统设计中必须考虑的问题,也是衡量操作系统质量优劣的重要因素之一。
计算机系统中的各种资源(包括硬件资源和软件资源)都由操作系统进行管理和分配。作业所需要的资源可以在调度到某个作业时根据作业提出的要求(例如,需要多少主存空间和需要哪些外围设备等)来分配,作业在分配进程执行时,各进程根据执行情况还可以动态地申请资源(例如,请求读某个文件、请求扩充主存区域以及请求使用打印机输出结果等)。
在前面的章节中介绍的对各类资源的管理和分配技术,主要目的是要充分发挥各个资源的作用,提高资源的利用率。当多个进程竞争共享资源时,还可采用必要的措施来实现资源的互斥使用和保证进程能在有限的时间内获得所需的资源。
但是,这些管理和分配都是根据作业或进程对某类或某个资源的需求来进行分配和调度的,而没有考虑一个进程已经占了某些资源后又要申请其他资源时会发生怎样的情况。事实上,计算机系统中有限的资源与众多请求分配资源的进程间会存在矛盾。
当若干进程需求资源的总数大于系统能提供的资源数时,进程间就会出现竞争资源的现象,如果对进程竞争的资源管理或分配不当就会引起死锁。
由于以下两种情况造成进程永远等待不属于我们要讨论的死锁问题。
(1)如果出现某个进程申请系统中不存在的资源或申请的资源数超过了系统拥有的最大资源。
(2)由于硬件故障或程序性错误引起的循环等待。
所以,在讨论操作系统设计中可能引起的死锁问题时应避免与硬件故障及其他程序性错误纠缠在一起。
为此,我们假定,任何一个进程要求资源的最大数量不超过系统能提供的最大量。任何一个进程在执行中所申请的资源能得到满足,那么它一定能在有限的时间内执行结束且归还它所占的全部资源。-个进程在申请资源得不到满足时才处于等待资源状态。
在这些假定下若出现死锁则是由于操作系统对资源管理不当引起的,否则另当别论。
二、死锁的必要条件:
死锁不仅会发生在两个进程之间,也可发生在多个进程之间。死锁不仅会在动态使用外部设备时发生,而且也可能主动态使用缓冲区、数据库等时发生,甚至在进程通讯过程中发生。随着计算机资源的增加,系统出现死锁现象可能性也大大地增加。
要解决死锁问题,应先分析在什么情况下可能发生死锁,从上面引起死锁的例子中可以看出系统出现死锁一定同时保持了四个必要条件:
(一)互斥使用资源 | 每个资源每次只允许一个进程使用,当有进程在使用某个资源时,其他想使用该资源的进程必须等待,直到使用资源者归还资源后才允许另一进程使用该资源。 |
(二)占有并等待资源 | 进程占有了某些资源后又申请新资源,但得不到满足而处于等待资源状态,且不释放已经占有的资源。 |
(三)不可抢夺资源 | 任何一个进程不能抢夺其他进程占用的资源,即已被占用的资源只能由占用资源的进程自己来释放。 |
(四)循环等待资源 | 存在一组进程P1,P2,…,Pn,其中每一个进程都在等待另一个进程占用的资源,即 Pl等待P2占用的资源,P2等待P3占用的资源,…,P(n-1)等待Pn占用的资源,而Pn又等待P1所占用的资源。 |
四个必要条件分析:
要想防止死锁的发生,其根本的办法就是使上述必要条件之一(或多个条件)用不存在。换言之,就是破坏其必要条件使之永不成立。
三、资源分配图:
计算机系统中的资源可分成若干类,例如,主存空间、处理器、文件、打印机、磁带机和磁盘机等,每类资源可以有多个资源。
如果进程申请一个某类资源时,可以把该类资源中的任意一个空闲资源分配给进程,则说该类资源中的所有资源是等价的。
等价的资源组合在一起称为是一个"资源类",例如,两台打印机可组成一个资源类,三台磁带机也可组成-个资源类。一个计算机系统中可以有多个资源类,若某系统有m个资源类,用Ri表示第i个资源类,则该系统的资源类集合为{R1,R2,…,Rm}。我们把每个资源类用一个方框来表示,在方框中用圆点来表示该资源类中的各个资源。
把每个进程用一个圆圈来表示,用有向边来表示进程申请资源和资源分配的情况。约定Pi→Rj,表示进程Pi申请资源类Rj中的一个资源得不到满足而处于等待Rj类资源的状态,该有向边从进程开始指到方框的边缘,表示进程只申请Rj类中的-个资源而不是指定Rj类中的某个资源。Rj→Pi表示Rj类中的一个资源已被进程Pi占用,由于已把一个具体的资源分配给了进程Pi,故该有向边从方框中的某个圆点出发指向进程。
现假定有3类资源R1,R2,R3,其中R1和R3都只有1个资源,R2有2个资源。有3个进程P1,P2,P3,每个进程占用资源和等待资源的情况如下表所示:
于是,可作出如下图所示的资源分配图:
从图9-2-1中看出,各进程占用和等待资源的情况没有形成环路,因而没有死锁发生。但是,如果进程P3又提出申请一个R2类资源的要求,由于当前R2中没有可被分配的资源,于是,要增加一条有向边P3→R2,如下图(有死锁的资源分配图)所示:
从上图中可看出进程P2在等待被进程P3占用的资源R3。进程P3在等待被进程P1或P2占用的资源R2。进程P1又在等待被进程P2占用的资源R1。于是,存在两条环路:
P1→R1→P2→R3→P3→R2→P1
P2→R3→P3→R2→P2
这两条环路使进程P1,P2,P3等待资源的状态永远结束不了,这三个进程陷入了死锁。
现在再来看一个图9-2-3所示的例子,在这个例子中也存在一个环路
P1→Rl→P3→R2→P1
但是,这条环路不形成死锁。因为进程Pl和进程P3分别等待R1和R2类中的资源,由于进程P2和进程P4不再申请其他资源,它们能在有限时间里执行结束而归还 R1类和R2类资源,归还的资源可以分配给进程P1和进程P3。显然进程P1和进程P3不会永远出于等待资源状态。
有环路无死锁的资源分配图
从上面的讨论中我们可以得到如下结论:
(1) 如果资源分配图中无环路,则系统中没有死锁发生。
(2) 如果资源分配图中有环路,且每个资源类中只有一个资源,则环路的存在就意味着死锁的形成,在环路中的进程就处于死锁状态。
(3) 如果资源分配图中有环路,但涉及到的资源类中有多个资源,则环路的存在未必就有死锁形成。
图2和图3分别是有环路有死锁和有环路无死锁的例证,从而证实了"循环等待资源"仅是死锁的必要条件,而不是充分条件,这对讨论死锁问题是很重要的。
四、解决死锁问题的几个策略:
为了不发生死锁,必须设法破坏产生死锁的之一。
四个必要条件:
条件1:难以否定,但可采用相应的技术,如利用假脱机技术,即用可共享使用的设备模拟非共享的设备;
条件2:容易不定,可制定相应的规则即可,例如,当一个进程(程序)申请某资源被拒绝,则必须释放已占用的资源,如需要再与其它所需资源一起申请。对CPU还可进行可剥夺分配。
条件3:也是很容易否定的,只要分配策略上规定一个进程(或程序)一次将所需资源一次申请到位。用完后释放。可以全部用完后,统一释放,也可使用完后立即释放,只要是一次申请到的,系统就不会出现死锁。
条件4:实际上系统不采用部分分配,也就破坏了环路条件。
五、死锁的防止:
下面我们将分析这4个必要条件且给出一些能使相应条件不成立的资源分配策略。
1.互斥条件:
要使互斥使用资源的条件不成立,唯一的办法是允许进程共享资源。"只读"文件是一种很好的共享资源,多个进程可以同时打开一个"只读"文件,同时对该文件执行"读"操作,因而进程在使用"只读"文件时不会成为等待状态。
但是,在计算机系统中大多数资源都必须互斥使用,这是由于资源本身的固有特性决定的。
例如,打印机是不能被多个进程共享的。对可共享的磁盘来说,任何时刻也只允许一个进程启动它。所以,要破坏"互斥使用资源"的条件经常是行不通的。
2.占有并等待资源:
要使占有并等待资源的条件不成立,经常使用两种方法:
(一)静态分配资源:
显然,采用静态分配资源的策略后,进程在执行过程中不再申请资源,故不可能出现占有了某些资源再等待其他资源的情况,即能使得"占有并等待资源"的条件不成立,从而防止死锁的发生。
静态分配资源的策略实现起来简单,但却降低了资源的利用率。例如,某进程要对存放在磁带上的文件进行处理后再打印输出。按照静态分配策略,该进程在得到磁带机和打印机后才开始执行,但在处理文件这段时间里打印机被闲置,仅在文件处理结束后才使用打印机。
(二)释放已占资源:
还是以进程对存放在磁带上的文件进行处理后再打印输出为例,进程可以先申请磁带机,在得到磁带机后进程就可开始执行,它启动磁带机,读出文件进行处理,把处理后的文件保存在自己的工作区。然后,先归还(释放)磁带机,再申请打印机,当得到打印机后就可把处理好的文件打印输出,结束时归还打印机。
这种资源分配策略仍会使进程处于等待资源状态,这是因为进程所申请的资源可能已被其他进程占用,只能等占用者归还资源后才可分配给申请者。但是,申请者是在归还资源后才申请新资源的,故不会出现占有了部分资源再等待其他资源的现象。
3.不可抢夺资源:
这个条件是不允许进程抢夺已经被分配的资源,为了使这个条件不成立,我们可以约定如下:如果一个进程已经占有了某些资源又要申请新资源,而新资源不能满足(已被其他进程占用)必须等待时,系统可以抢夺该进程已占有的资源。具体做法:
(1)若进程A申清的资源r已被进程B占用,则查看进程B的状态。如果进程B处于等待另一个资源的状态,那么就抢夺进程B已占的资源r并把r分配给进程A;如果进程B不是处于等待资源状态,则让进程A处于等待资源r的状态。
(2)一个等待资源的进程只有在得到自己所申请的新资源和所有被抢夺的老资源后才能继续执行。
这种可抢夺的资源分配策略不是对所有资源都适用的,例如,对打印机、磁带机等就不能采用抢夺的方式,否则造成使用混乱。
目前抢夺式的分配策略只适用于主存空间和处理器。
例如,当若干进程都请求扩充主存空间得不满足而处于等待时,为防止永远等待的发生,系统就可抢夺某进程已占的主存空间分配给一个等待主存资源的进程,使该进程得到足够的主存空间后能执行到结束,然后归还所占的全部主存空间,系统再把收回的主存空间分配给被抢夺了主存空间的进程或其他等待主存空间的进程,使它们能继续执行。
对处理器的分配大家都已清楚,实际上,"时间片轮?quot;和"可抢占的优先数调度"算法都是抢夺式的分配处理器的策略。
此外,一个占有处理器的进程在申请其他资源得不到满足时,系统把该进程置成等待资源的状态,也就是抢夺丁该进程使用处理器的权力,把处理器分配给其他的进程使用。
4.循环等待条件:
对资源采用按序分配的策略可以使循环等待资源的条件不成立。
把系统中所有资源排一个顺序,对每一个资源给一个确定的编号,规定任何一个进程申请两个以上的资源时,总是先申请编号小的资源,再申请编号大的资源。例如,系统共有m个资源,假定编号为1, 2,…,m,于是这m个资源是
rl, r2,…; rm
任何一个进程在得到了资源rj之后,若再申请资源ri,则必定是i<j。可以证明按这种策略分配资源时不会出现循环等待资源的情况。
可用反证法,假定有循环等待资源的情况,则一定存在一组进程P1,P2,…,Pn,其中每一个进程Pi(i=1,2,…,n-1)都在等待资源rki(1≤ki≤m),而资源rki,已被进程P(i+1)
占有,Pn等待的资源被P1占有。依照按序分配的原则可列出如表9-3-1所示的关系。
由此可推得
kn<k1<k2<…<k(n-1)<kn。
于是,发生了kn < k1而k1<kn的矛盾。故存在循环等待资源的假设是不能成立的。
把按序分配的策略应用到5个哲学家问题中,规定每个哲学家想吃面时总是先取编号小的叉子再取编号大的叉子就不会形成死锁。根据按序分配的要求,应把第5个哲学家的程序修改成:
PROCESS P5
begin
L5:{思考};
P(S1);
{取f1};
P(S5);
{取f5};
{吃通心面};
{放下f1和f5};
V(S1);
V(S5);
goto L5
end;
于是,当每个哲学家都想吃面时,可能前4个哲学家都已拿到了自己左边的一把叉子,而第 5个哲学家拿不到编号小的叉子n(被哲学家P1已拿走)而等待,就不可能去拿另一把叉子 f5。因此,第4个哲学家就有机会拿起右边的叉子f5而可以吃面,吃过后放下两把叉子,使第3个哲学家又可得到右边的叉子去吃面。同样地,第2个哲学家和第1个哲学家也都先后可吃到面。当第1个哲学家放下叉子后,第5个哲学家也可得到吃面的机会了,从而防止了死锁。
采用按序分配策略的最大困难是怎样合理地给各个资源编号,通常应按大多数进程使用资源的次序来给资源顺序编号。但是,总会有一些进程使用资源的次序与系统确定的资源编号的顺序不一致,就会出现后使用的资源必须先申请,先得到的资源可能在较长的时间里空闲着,明显降低了资源使用率。
5.一种按需分配策略:
这种算法资源按某种规则系统中的所有资源统一编号(例如打印机为1.磁带机为2.磁盘为3.等等),申请时必须以上升的次序。
系统要求申请进程:
1.对它所必须使用的而且属于同一类的所有资源,必须一次申请完;
2.在申请不同类资源时,必须按各类设备的编号依次申请。
例如: 进程PA,使用资源的顺序是R1,R2;
进程PB,使用资源的顺序是R2,R1;
若采用动态分配有可能形成环路条件,造成死锁。采用有序资源分配法:R1的编号为1,R2的编号为2;
PA:申请次序应是:R1,R2
PB:申请次序应是:R1,R2
这样就破坏了环路条件,避免了死锁的发生。
优点:基于动态分配方法,资源利用率较静态分配法提高。 该策略关键在于小心安排资源序号!
该策略虽然在许多操作系统中已经被执行,但也存在一些问题:
1)各类资源序号一经安排,不宜经常地随意改动;最少需要维持一个比较长的时期。在此期间,若要添置一些新设备,就必须重新改写已经存在的程序和系统。
2)资源序号尽可能反映多数作业的实际使用资源的顺序,但总有不合适的作业而造成资源浪费。
本章小结:
若系统中存在一组进程,它们中的每一个进程都占用了某种资源而又都在等待其中另一个进程所占用的资源,这种等待永远不能结束,则说系统出现了"死锁"。
死锁是由于进程竞争互斥使用的资源且又互不相让形成的,所以,系统中形成死锁一定同时保持了4个必要条件,即互斥使用资源、占有并等待资源、不可抢夺资源和循环等待资源。但要注意这是必要条件,而不是充分条件。
解决死锁问题可以有3种方式:
(1)死锁的防止:
预先确定一些资源分配策略,进程按规定申请资源,系统按预定的策略进行分配,这些分配策略均能使4个必要条件中的一个条件不成立,从而使系统不发生死锁。
(2)死锁的避免:
当进程提出资源申请时系统动态测试资源分配情况,仅当能确保系统安全时才把资源分配给进程。银行家算法虽然很保守;但它可保证系统时时刻刻都处于安全状态。
(3)死锁的检测:
对资源的申请和分配不加限制,只要有剩余的资源就可把资源分配给申请者。这样就可能出现死锁,于是,系统要定时运行一个"死锁检测程序"。检测时没有发现死锁则系统可继续工作,检测时发现有死锁则必须先解除死锁再继续工作。
在一个实际的操作系统中要兼顾资源的使用效率和安全可靠,对不同的资源可采用不同的分配策略,往往采用死锁的防止、避免和检测的混合策略,以使整个系统能处于安全状态不出现死锁。
同步练习:
1.产生死锁的四个必要条件是
A.互斥条件、不可抢占条件、占有且申请条件、循环等待条件
B.同步条件、占有条件、抢占条件、循环等待条件
C.互斥条件、可抢占条件、申请条件、循环等待条件
D.同步条件、可抢占条件、申请条件、资源分配条件
参考答案:A
2.下述A.B.C.D描述中, 发生进程死锁
A.进程A占有资源R1,等待进程B占有的资源R2;进程B占有资源R2,等待进程A占有的资源R1,R1.R2不允许两个进程同时占用。
B.进程A占有资源R1,进程B等待进程A占有的资源R1,R1.R2不允许两个进程同时占用。
C.进程A占有资源R1,进程B占有资源R2。
D.进程A占有资源R1,等待占有R2,进程B占有R2,R1.R2不允许两个进程同时占用。
参考答案:A
3.下列A.B.C.D描述中 发生进程通信上的死锁
A.某一时刻,发来的消息传给进程A,进程A传给进程B,进程B得到的消息传给进程C,则A.B.C三进程。
B.某一时刻,进程A等待B发来的消息,进程B等待C发来的消息,而进程C又等待进程A发来的消息,消息未到,则A.B.C三进程。
C.某一时刻,发来的消息传给进程C,进程C再传给进程B,进程B再传给进程A,则A.B.C三进程。
D.某一时刻,发来的消息传给进程B,进程B再传给进程C,进程C再传给进程A,则A.B.C三进程。
参考答案:B
4.下述A.B.C.D描述中 发生进程死锁
A.系统中只有一台CD-ROM和一台打印机,进程A占有了CD-ROM又申请打印机,但不能立即满足,因为进程B占有打印机。强行A释放占有的CD-ROM,以后再重新申请。进程A释放的CD-ROM让给进程B,则A.B进程。
B.系统中只有一台CD-ROM和一台打印机,排序为R1.R2,对立序号为1.2,A.B进程对R1.R2的请求严格资源序递增的顺序提出,则进程A.B。
C.系统中只有一台CD-ROM和一台打印机,进程A.进程B运行前一次性向系统申请它需CD-ROM和打印机,则进程A.B。
D.系统中只有一台CD-ROM和一台打印机,进程A占有了CD-ROM,又申请打印机,进程B占有了打印机又申请CD-ROM,则A.B.进程。
参考答案:D
5.死锁时,如没有外力的作用,则死锁
A.涉及到的各个进程都将永久处于封锁状态。
B.涉及到的单个进程处于封锁状态。
C.涉及到的单个进程处于等待状态。
D.涉及到的进程暂时处于封锁状态。
参考答案:A
6.互斥条件是指
A.某资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占有。
B.一个进程在一段时间内只能占用一个资源。
C.多个资源只能由一个进程占有。
D.多个资源进程分配占有。
参考答案:A
7.进程所获得的资源在未使用完之前,资源申请者不能强行地从资源占有者手中夺取资源,而只能由该资源的占有者进程自行释放。此指
A.强行占有
B.等待占有
C.不可抢占条件
D.自行释放
参考答案:C
8.存在一进程等待序列{P1.P2 ……Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的资源,……而Pn等待P1所占有的资源形成一个
A.进程顺序推进
B.进程循环等待环
C.资源有序分配
D.资源强占
参考答案:B
1.何谓死锁?产生死锁的原因是有哪些?
若系统中存在一组进程、它们中的每—个进程都占用了某种资源而又都在等待其中另一个进程所占的资源,这种等待永远不能结束,则说明系统出现了死锁。产生死锁的原因有两个:一是操作系统对资源的管理不当,二是没有顾及进程并发执行时可能出现的情况。
2.可以通过哪些途径防止死锁的产生?
采用某些资源分配策略使死锁的四个必要条件之一不成立,就能防止死锁。除第一个条件互斥使用资源没有对应策略外,对占有并等待资源、不可抢夺资源和循环等待资源这三个条件可采用静态分配资源,释放已占资源,抢夺式分配资源和按序分配资源等资源分配策略。
3.什么叫系统处于安全状态?常用什么方法保持系统处于安全状态?
如果操作系统能保证所有的进程在有限的时间内得到需要的全部资源,则称系统处于安全状态。常用银行家算法动态地检测系统中的资源分配情况和进程对资源的需求情况进行资源分配,确保系统处于安全状态。
4.简述解决死锁问题的三种方法。
解决死锁问题有以下三种方法:(1)死锁的防止。系统按预定的策略为进程分配资源,这些分配策略能使死锁的四个必要条件之一不成立,从而使系统不产生死锁。(2)死锁的避免。系统动态地测试资源分配情况,仅当能确保系统安全时才给进程分配资源。(3)死锁的检测。对资源的申请和分配不加限制,只要有剩余的资源就可把资源分配给申请者,操作系统要定时判断系统是否出现了死锁,当有死锁发生时设法解除死锁。
5.用抢夺资源的方法解除死锁时要注意什么问题?
用抢夺资源的方式解除死锁时要注意三点:(1)抢夺进程资源时希望付出的代价最小。(2)为被抢夺者的恢复准备好条件,如返回某个安全状态,并记录有关信息。(3)防止被抢夺资源的进程"饿死",一般总是从执行时间短的进程中抢夺资源。