一、死锁的产生
1、产生死锁的原因
① 竞争资源,当系统中供多个进程共享的资源,如打印机、公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁
② 进程间推进顺序非法,进程在运行过程中,请求和释放资源的顺序不当,也会导致进程死锁。
2、产生死锁的必要条件
① 互斥条件,指进程对所分配到的资源进行排他性使用,即在一段时间内某资源只由一个进程占用,如果此时还有其他进程请求该资源,则请求者只能等待,直至占有该资源的进程用完释放。
② 请求和保持条件,指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又已经被其他进程占用,此时请求进程阻塞,但又对自己已获得的其他资源保持不放。
③ 不剥夺条件,指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
④ 环路等待条件,指在发生死锁时,必然存在一个进程-资源的环形链,即进程集合{p0,p1,p2,...,pn}中的p0正在等待p1占用的资源,p1在等待p2占用的资源,...,pn正在等待p0占用的资源。
破坏其必要条件,即是处理死锁的方法
二、处理死锁的方法
① 预防死锁,该方法通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个,来预防死锁。其是一种比较容易实现的方法,已经被广泛使用,但由于所施加的限制条件往往太严格,因而可能会导致系统资源利用率和系统吞吐量降低。
② 避免死锁,该方法也是事先预防的策略,但它并不需要事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
③ 检测死锁,该方法并不需要事先采取任何限制措施,也不必要检查系统是否已经进入不安全区,而是允许系统在运行过程中发生死锁,但可通过系统所设置的检测机构,及时检测死锁的发生,并精确地确定与死锁有关的进程和资源,然后,采取适当措施,从系统中将已发生的死锁清除掉。
④ 解除死锁,这是与检测死锁相配套的一种措施,当检测到系统中已经发生死锁时,需将今晨从死锁状态中解脱出来,常用的实施办法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。
二、处理死锁详讲
1、银行家算法避免死锁
1. 银行家算法的数据结构
① 可利用资源向量Available,这是一个含有m个元素的数组,其中每一个元素代表一类可利用的资源数目,初始值为系统所配置的改类全部可用资源的数目,Available[j] = k,表示系统中Rj资源又k个。
② 最大需求矩阵Max,这是一个n * m 的矩阵,定义了系统中n个进程中的每一个进程对m类资源的最大需求,Max[i,j] = k,表示进程i需要Rj类资源的最大数目为k。
③ 分配矩阵Allocation,是一个n * m 的矩阵,定义了系统中每一类资源当前已经分配每一进程的资源数,Allocation[i,j] = k,表示进程i已经分得Rj类资源的数目为k。
④ 需求矩阵Need,是一个n * m的矩阵,表示每一个进程尚需的各类资源数。Need[i,j] = k,表示进程i还需要Rj类资源k个。
Need[i, j] = Max[i, j] - Allocation[i, j]
2. 银行家算法
设Requesti进程Pi的请求向量,若Requesti[j] = K,表示进程Pi需要Rj类资源K个,当Pi发出资源请求后,系统按照下述步骤进行检查
① 如果Requesti[j] <= Need[i, j],转向②,否则,因为它所需要的资源数已超过它所宣布的最大值,出错。
② 如果Requesti[j] <= Available[j],转向③,否则,表示尚无足够资源,Pi需要等待。
③ 系统尝试把资源分配给进程Pi,并修改数据结构中的数值:
Available[j] = Available[j] - Requesti[j];
Allocation[i, j] = Allocation[i, j] + Requesti[j];
Need[i, j] = Need[i, j] - Requesti[j];
④ 系统执行安全性算法,检查此次资源分配后系统是否处于安全状态,若安全,才正式将资源分配给进程Pi,以完成本次分配,否则,将本次的尝试分配作废,恢复原来的资源分配状态,让进程Pi等待。
3. 安全性算法
系统所执行的安全性算法可描述如下
① 设置工作向量Work,表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work = Available;
② 设置Finish,表示系统是否有足够的资源分配给进程,使之运行完成,开始时Finish[i] = false,当有足够资源分配给进程时,再令Finish[i] = true;
③ 从进程集合中找到一个能满足下述条件的的进程:Finish[i] = fasle;Need[i, j] <= Work[j],若找到,进入④,否则,执行⑤
④ 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,执行 Work[j] = Work[j] + Allocation[i, j]; Finish[i] = true;进入步骤③
⑤ 如果所有的进程的Finish[i] = true都满足,则表示系统处于安全状态,否则,系统处于不安全状态。
2、死锁的检测
当系统为进程分配资源时,若未采取任何限制性措施,则系统必须提供检测和解除死锁的手段,系统必须要做到
① 保存有关资源的请求和分配信息
② 提供一种算法,以利用这些信息来检测系统是否已进入死锁状态。
资源分配图用圆圈代表一个进程,用方框代表一类资源,用方框中的一个点代表一类资源中的一个资源。请求边由进程指向方框中的资源,分配边由方框中的一个点即资源指向进程。
为死锁状态的充分条件是:当且仅当S状态的资源分配图是不可完全简化的,该充分条件称为死锁定理。