思维导图

进程死锁思维导图

导语

进程进行过程中 尤其是是并发进程中容易出现一种情况 那就是死锁。死锁是很危险得一种清空,会导致系统中得其他进程无法进行 长时间地进行等待而无法运行。这里就简单讲讲死锁是什么,为什么产生,如何避免死锁,以及如何解除死锁

是什么

两个进程乃至多个进程互相竞争资源,某些进程进入无限期等待的情况

为什么

原因主要用两点:资源少,推进顺序不当。

资源问题

例子一:平安夜夜晚,超市中只有一个苹果正在售卖,现在有两个人同时需要这一个苹果送给女友。如果A获得了苹果 ,那么B就没有苹果,不可以送给女友 ,就是等死状态(进程死锁)。这种就类似之前所说得资源不足得情况了。如果超市有两个苹果,那么这种情况就不会出现了。

注意: 这里面就已经隐含了关于资源得一点介绍。对了,就是苹果是可消耗得,所以资源又分可消耗和不可消耗得。现在换了一个思路,不是苹果了。而是水杯呢?

例子二 两个人同时需要喝水,超市也一样只有一个杯子,如果A先喝完水之后,再给B用,那么也就不会出现死锁了。这里得水杯就是不可消耗资源,也叫可重用资源.

注意: 这里也一样包含了一个隐含条件,就是A如果喝完之后 不给B用了。那B岂不是GG了,你想计算机中 进程完成时一定要释放资源得了,不怕他不给。但是如果A喝完之后 还在运行呢,那怎么办?那岂不是一直要等待了。所以这里面同样包含了可剥夺和不可剥夺得资源得限制了。以及还有相应得推进顺序问题。具体情况 看视频。这里就不花那么多时间解释了。简单提一下:可剥夺,类似计算机中得CPU,进程运行时可剥夺。不可剥夺,类似打印机,打印到一半不可停止得那种,为不可剥夺。

推进顺序问题

例子三:进程A 需要一个打印机得资源 和 一个输入得资源。

进程B 需要一个打印机和 键盘资源。

系统中 只有一个打印的资源 一个输入得资源。

进程A 先获得输入资源 再得到打印机资源 A完成 释放所占有得资源。进程B完成。

A获得打印机 B获得输入资源 两者同时等待下一个资源。这种情况就会产生死锁

怎么预防

预防得最好办法就是将系统得那些必要条件中断一个以上便可以了。但是互斥条件是不可以破坏得,一旦破坏,系统会出现数据错误等各种不可控因素。

破坏占有且等待条件

有两个解决办法,第一个便是在进程一开始时便分配了全部执行过程中需要的资源。好处? 缺点?

第二个便是在系统之中动态分配资源。原有的旧资源释放之后 才分配新资源,此时进程可以运行

破坏不可剥夺条件

与破坏占有且等待条件类似,设定进程如果占有旧资源且需要新资源的时候,如果新资源求不得,那么系统会剥夺这些资源 给其他进程使用。而原先的进程,必须要同时得到以前得新资源和原先得旧有资源,进程才能继续执行。

破坏循环等待条件

按照计算机得资源进行资源序号分配。根据大部分进程使用得资源顺序确定进程序号。使用了进程序号大的资源,不允许再申请序号小的资源了。

怎么避免

安全状态

安全状态定义;设系统中有N个进程,存在一个进程序列<P1,P2,P3,..Pi….Pn>使得进程Pi(i=1,2,3…n),以后还需要的资源可以通过系统现有的空闲资源加上所有Pj(j<i)进程已占有的资源来满足,则称此时系统处于安全状态,进程序列<P1,P2,P3,…Pn>称为安全序列。

银行家算法

数据结构

可利用资源向量Avaliable:系统中当前可用各类资源数目

最大需求矩阵Max:进程在执行过程中的需要各类资源的最大总数

分配矩阵:Allocation: 进程已经得到了一定各类的资源

需求矩阵:Need。进程还需要多少个资源才能完成。数目等于Max - Allocation

安全性算法

用于判断是否处于系统是否处于安全状态。

很简单得一种思想。这个安全性算法其实就一个循环加判断而已。会看刚才得数据结构,里面有最大需求矩阵Max,和Available可用资源向量,和Need矩阵。

第一步,从进程序列中找到一个没有完成得进程,且此进程得所请求得资源数目Work <= Need矩阵

第二步,尝试修改Avaliable资源向量,也就是给此进程分配资源。然后释放掉此进程,获取此进程中所有资源数加上原先剩下得资源,判断下一个进程能否继续类似如此执行,如果进程序列中每一个进程都可以执行,那就是处于安全状态,否则就是不安全状态

详解可以看这里:

安全性算法

银行家算法举例

例子四

例子四

例子四解答

例子四解答1

视频