思维导图
导语
进程进行过程中 尤其是是并发进程中容易出现一种情况 那就是死锁。死锁是很危险得一种清空,会导致系统中得其他进程无法进行 长时间地进行等待而无法运行。这里就简单讲讲死锁是什么,为什么产生,如何避免死锁,以及如何解除死锁
是什么
两个进程乃至多个进程互相竞争资源,某些进程进入无限期等待的情况
为什么
原因主要用两点:资源少,推进顺序不当。
资源问题
例子一:平安夜夜晚,超市中只有一个苹果正在售卖,现在有两个人同时需要这一个苹果送给女友。如果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资源向量,也就是给此进程分配资源。然后释放掉此进程,获取此进程中所有资源数加上原先剩下得资源,判断下一个进程能否继续类似如此执行,如果进程序列中每一个进程都可以执行,那就是处于安全状态,否则就是不安全状态
详解可以看这里:

银行家算法举例
例子四
例子四解答
