1、第四章 死锁,死锁的概念 死锁的预防和避免 死锁的检测和解除,死锁的概念,死锁举例 产生死锁的原因 产生死锁的必要条件 处理死锁的基本方法,死锁举例,例1: 两个小孩在一起玩耍,一个在玩皮球,另一个玩自动步枪,如果这两个小孩都要对方手中的玩具,而又不肯先放掉自己拿着的玩具,这时就发生了僵持局面。,例2: 设系统有一台打印机和一台扫描仪,进程P1、P2并发执行,在某时刻T,进程P1和P2分别占用了打印机和扫描仪。在时刻T1(T1T),P1又要申请扫描仪,但由于扫描仪被P2占用,P1只有等待。在时刻T2(T2T),P2又申请打印机,但由于打印机被P1占用,P2只有等待。如此两进程均不能执行完成。称
2、这种现象为死锁。,例3: 在生产者-消费者问题中将生产者进程的两个P操作颠倒时会发生死锁。 将消费者进程的两个P操作颠倒时也会发生死锁。,死锁的定义,一组进程中,两个或多个进程都无限期地等待永远不会发生的条件,我们称此系统处于死锁状态。,死锁(Deadlock) 饥饿(Starvation),死锁的起因,根本原因:系统能够提供的资源个数比要求该资源的进程所需的资源个数少。,判断,1 参与死锁的所有进程都占有资源错误:有可能有的进程在等待其他进程释放资源2 参与死锁的所有进程均正在等待资源错误:有可能一个占有资源3 参与死锁的所有进程中至少有两个进程占有资源 错误4 参与死锁的进程至少有两个正确
3、,参与死锁的进程最少是两个(两个以上进程才会出现死锁) 参与死锁的进程至少有两个已经占有资源 参与死锁的所有进程都在等待资源 参与死锁的进程是当前系统中所有进程的子集注:如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃,关于死锁的一些结论,产生死锁的必要条件,四个必要条件(重点) 互斥条件:涉及的资源是非共享的。 不剥夺条件:不能强行剥夺进程拥有的资源。 部分分配条件:进程在等待一新资源时继续占有已分配的资源。 环路条件:存在一种进程的循环链,链中的每一个进程已获得的资源同时被链中的下一个进程所请求。,处理死锁的基本方法,1、预防死锁: 通过设置某些限制条件,去破坏死锁四个必要条件中的一个或
4、多个,来防止死锁。较易实现,广泛使用,但由于所施加的限制往往太严格,可能导致系统资源利用率和系统吞吐量的降低。,2、避免死锁: 不事先采取限制去破坏产生死锁的条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁的发生。实现较难,只需要较弱的限制条件,可获得较高的资源利用率和系统吞吐量。,3、检测死锁: 事先并不采取任何限制,也不检查系统是否进入不安全区,允许死锁发生,但可通过检测机构及时检测出死锁的发生,并精确确定与死锁有关的进程和资源,然后采取适当措施,将系统中已发生的死锁清除掉,4、解除死锁: 与检测死锁相配套,用于将进程从死锁状态解脱出来。 常用的方法是撤消
5、或挂起一些进程。以回收一些资源,再将它们分配给处于阻塞状态的进程,使之转为就绪状态。 实现难度大,但可获得较好的资源利用率和系统吞吐量。,死锁的预防和避免,死锁的预防 系统的安全状态 利用银行家算法避免死锁,死锁的预防,在系统设计时确定资源分配算法,保证不发生死锁具体的做法是破坏产生死锁的四个必要条件之一,破坏部分分配条件,系统要求所有进程要一次性地申请在整个运行过程中所需的全部资源。若系统有足够资源则完全分配。,优点:简单、易于实现且安全。 缺点: 一个用户在作业运行之前可能提不出他的作业将要使用的全部设备。 用户作业必须等待,直到所有资源满足才能运行。实际上某些资源可能要到运行后期才会用到
6、。 一个作业运行期间,对某些设备的使用时间很短,甚至不会用到。如:当用户作业出错时才需要打印机输出错误信息,但采用静态分配法必须把打印机分配给该作业,并长期占用。采用该方法对系统来说是非常浪费的。,破坏不可剥夺条件,一个已拥有资源的进程,若它再提出新资源要求而不能立即得到满足时,它必须释放已经拥有的所有资源。以后需要时再重新申请。实现复杂、要付出很大的代价。,破坏环路条件,系统中的所有资源都有一个确定的唯一号码,所有分配请求必须以序号上升的次序进行。例如:系统中有下列设备:输入机(1),打印机(2),穿孔机(3),磁带机(4),磁盘(5)。有一进程要先后使用输入机、磁盘、打印机,则它申请设备时
7、要按输入机、打印机、磁盘的顺序申请。,优点:同前两法相比,其资源利用率和系统吞吐量有较明显的改善。缺点:进程实际需要资源的顺序不一定与资源的编号一致,因此仍会造成资源浪费。,系统的安全状态,死锁避免定义在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配,安全状态,如果系统能按某种顺序(如P4,P1,,Pn, 称为安全序列)为每个进程分配其所需的资源,直至所有进程都能运行完成,称系统处于安全状态。若不存在这样一个安全序列称系统处于不安全状态。,安全状态举例,有三个进程p1,p2,p3,有12台
8、磁带机。P1共要求10台,P2共要求4台,P3共要求9台。在T0时刻,p1,p2,p3分别获得5、2、2台,尚有3台空闲。,经分析,在T0时刻,系统是安全的。 因为存在一个安全序列p2、p1、p3。见下图。,由安全状态向不安全状态的转换,如果不按安全序列分配资源,则系统可能会由安全状态进入不安全状态。如在T0以后,P3要求1台磁带机,若系统分给它一台,则系统进入不安全状态。因为其余2台分给P2,P2完成后,只能释放4台,这既不能满足P1(5台),也不能满足P3(6台)。将导致死锁。可见当P3申请资源时,尽管系统中有资源也不能分给它。,系统进入不安全状态,利用银行家算法避免死锁,最有代表性的避免
9、死锁算法,由Dijkstra提出。 1、银行家算法中的数据结构 可利用资源向量Available。它是一个含有m个元素的数组,其中每个元素代表一类可利用资源的数目。如:,最大需求矩阵Max。n*m矩阵,表示n个进程的每一个对m类资源的最大需求。,分配矩阵Allocation 。n*m矩阵,表示每个进程分配的资源数。,需求矩阵Need 。n*m矩阵,表示每个进程还需要各类资源数。,例,设系统有五个进程和三类资源,每类资源分别有10、5、7。在T0时刻资源分配情况如图,银行家算法描述,当进程pi提出资源申请时,系统执行下列步骤: (1)若RequestiNeedi,转(2);否则错误返回 (2)若
10、RequestiAvailable,转(3);否则进程等待,(3)假设系统分配了资源,则有: Available:=Available-Requesti; Allocationi:=Allocationi+Requesti; Needi:=Needi-Requesti (4)执行安全性算法,若系统新状态是安全的,则分配完成,若系统新状态是不安全的,则恢复原状态,进程等待,安全性算法,为进行安全性检查,定义数据结构: Work:ARRAY0m-1 of integer; Finish:ARRAY0n-1 of Boolean;m代表资源的数量,n代表进程的数量,安全性算法步骤,(1) Work:
11、=Available;Finish:=false; (2) 寻找满足下列条件的i:a). Finishi=false;b). NeediWork;如果不存在,则转(4),(3) Work:=Work+Allocationi;Finishi:=true;转(2) (4) 若对所有i,Finishi=true,则系统处于安全状态,否则处于不安全状态,T0时刻的安全性检查,T0时刻可以找到一个安全序列p1,p3,p4,p2,p0. 系统是安全的。,例1:T0时刻P1请求资源,P1发出请求Request(1,0,2),执行银行家算法,执行安全性算法,可以找到一个安全序列p1,p3,p4,p0,p2.
12、系统是安全的,可以将P1的请求分配给它。,例2:P4请求资源,P4发出请求Request(3,3,0), 执行银行家算法 Available=2 3 0 不能通过算法第2步( RequestiAvailable ),所以P4等待。,例3:P0请求资源,Request(0,2,0),执行银行家算法,进行安全性检查,Available2,1,0已不能满足任何进程需要,所以系统进入不安全状态,P0的请求不能分配,练习:有三类资源A(17)、B(5)、C(20)。有5个进程P1P5。T0时刻系统状态如下:问(1)、T0时刻是否为安全状态,给出安全序列。 (2)、T0时刻,P2: Request(0,3
13、,4),能否分配,为什么? (3)、在(2)的基础上P4:Request(2,0,1),能否分配,为什么? (4)、 在(3)的基础上P1:Request(0,2,0),能否分配,为什么?,解:(1) T0时刻得出安全系列,A(17)、B(5)、C(20) Work=available=2 3 3,先求出Need和Work,Work=2 3 3,(2) P2: Request(0,3,4),因( Available =2 3 3) Request(0,3,4) 所以不能分配,(3) P4:Request(2,0,1),Available =2 3 3,有安全序列P4 P5 P3 P2 P1 可
14、以分配,(4) P1:Request(0,2,0),0 1 2 已不能满足任何进程的需要,不能分配,死锁检测:允许死锁发生,操作系统不断监视系统进展情况,判断死锁是否发生一旦死锁发生则采取专门的措施,解除死锁并以最小的代价恢复操作系统运行,死锁的检测和解除,检测时机:当进程等待时检测死锁(其缺点是系统的开销大)定时检测系统资源利用率下降时检测死锁,死锁的解除,重要的是以最小的代价恢复系统的运行。方法如下:1)重新启动2)撤消进程3)剥夺资源4)进程回退,资源分配图,用有向图描述进程的死锁准确、形象系统由若干类资源构成,一类资源称为一个资源类;每个资源类中包含若干个同种资源,称为资源实例,二元组
15、G=(V,E)V:结点集,分为P,R两部分P=p1,p2,pnR=r1,r2,rmE:边的集合,其元素为有序二元组(pi,rj)或(rj,pi),表示法 资源类(资源的不同类型)用方框表示 资源实例(存在于每个资源中) 用方框中的黑圆点(圈)表示 进程 用圆圈中加进程名表示,分配边:资源实例进程的一条有向边申请边:进程资源类的一条有向边,例,死锁定理,如果资源分配图中没有环路,则系统中没有死锁,如果图中存在环路则系统中可能存在死锁如果每个资源类中只包含一个资源实例,则环路是死锁存在的充分必要条件,资源分配图化简,1)找一个非孤立点进程结点且只有分配边,去掉分配边,将其变为孤立结点 2)再把相应
16、的资源分配给一个等待该资源的进程,即将某进程的申请边变为分配边 3)重复以上步骤,若所有进程成为孤立结点,称该图是可完全简化的,否则称该图是不可完全简化的。死锁状态的充分条件是:当且仅当资源分配图是不可完全简化的。,有环有死锁,有环无死锁,有安全系列如下,例:,P0请求:Reqest(0,1,0),试探分配后,习题1,已分配的资源 最大需求量 A B C A B C P1 0 1 0 7 5 3 P2 2 0 0 3 2 2 P3 3 0 2 9 0 2 P4 2 1 1 2 2 2 P5 0 0 2 4 3 3 剩余资源 A B C 3 3 2,问题:此状态是否为安全状态,如果是, 则找出安全序列 在此基础上 P2 申请(1,0,2)能否分配?为什么? P5 申请(3,3,0)能否分配?为什么? P1 申请(0,2,0)能否分配?为什么?,习题2,1、 一台计算机共8台磁带机,由N个进程共享,每个进程最多要3台,问N为多少时不会有死锁,为什么? N=22、有R1(2)、R2(1)两类资源和两个进程P1、P2,两个进程均以 申请R1申请R2申请R1释放R1释放R2释放R1 顺序使用资源,求可能达到的死锁点,并画出此时的资源分配图。,解,当两个进程都执行完第1步后,无论哪个进程执行完第2步,以后,这两个进程再申请资源时就会死锁。,