天天看点

死锁概述---定义、危害、必要条件和处理方法

​ 死锁是一组进程在执行的过程中,因为竞争资源或者推进顺序不当导致的一种情况,在这种情况下,每个进程都在持有着自己已经抢占的资源,又同时等待别人释放资源,最终这一组进程都一直僵持谁也无法运行。其实我们在前面的学习中已经接触过死锁的概念了,比如我们前面讲到的​​哲学家进餐问题​​,如果每一位哲学家都因饥饿同时拿起了他们左边的筷子,当每位哲学家又试图拿起他们右边的筷子时,将会因为无法获取筷子而无限期的等待,从而产生死锁问题,在当时我们戏说哲学家会因为饥饿而饿死。在我们之前的文章中,我们讨论了许多种方法来解决哲学家进餐问题,这些方法也就是解决死锁问题的一些探讨,今天,就让我们一起来研究死锁,让死锁对你毫无保留。

1.死锁的定义

​ 在一组进程发生死锁的情况下,这组死锁进程中的每一个进程,都在等待另一个死锁进程所占有的资源。但是由于所有这些进程都因为申请不到临界资源而无法运行,也因此无法释放已经获取的资源,致使没有任何一个进程能被唤醒,导致所有的进程只能无限期的等待下去。

​ 因此,死锁的定义如下:如果一组进程中的每一个进程都在等待由该组进程中其他进程才能引发的事件,那么该组进程是死锁的。

​ 这里,我们再次把死等和忙等这两个概念提出来,我们着重说一下死等。死等这个概念出于进程同步机制的四大原则----有限等待:对要求进入临界区的进程,应保证在有限的时间能进入自己的临界区,以面陷入“死等”状态。这里我们在结合死锁的定义、哲学家进餐问题来看,死等中的有限时间就是避免进程进入死锁状态,这两个概念在一定程度上也是相同的。

2.死锁的危害

​ 通过上面的描述,我们也能知道,死锁不是一个好的现象,应该说他是是一个会导致OS资源利用率降低甚至会导致OS崩溃的毒瘤。下面我们来一起看下死锁的危害:

  • 死锁会使这一组进程无法继续运行,因此这些进程无法得到正确的结果,而这可能就是导致我们使用电脑的过程中出现进程未响应的原因;
  • 死锁会使OS中的资源的利用率降低。因为处于死锁状态的进程不释放已占有的资源,以至于这些资源一直无法被其他进程利用;
  • 死锁可能导致系统崩溃。如果涉及的进程占有过多的资源,那么这一组相关进程的范围就会扩大,就像瘟疫一样,逐渐传播,最后导致OS中没有一个进程可以执行。

3.死锁产生的原因

​ 知道了死锁的危害后,我们就需要看下死锁是如何产生的?首先我们要明白,死锁的起因通常是源于多个进程对资源的争夺,死锁的产生概率性事件(比如哲学家进餐问题中,五个哲学家都拿起了左边的筷子时,才有可能发生死锁),就算满足产生死锁的条件,死锁不一定会发生。

​ 要了解死锁产生的原因前,我们需要理解下计算机中的资源种类。

​ 可重用性资源:可重用性资源,顾名思义,可供用户重复使用多次的资源,它具有以下三个性质:1.每一个可重用性资源中的单元只能分配给一个进程使用,无法多个进程同时共享;2.进程使用资源必须要,请求资源->使用资源->释放资源;3.系统中每一类可重用性资源的单元数目是相对固定的,进程运行期间无法创建也无法删除。可重用性资源是典型的临界资源。

​ 可消耗性资源:又称为临时性资源,和可重用性资源相反,它是进程在运行期间动态地创建和消耗的,它具有如下性质:1.系统中每一类可消耗性的单元数目在进程运行期间是可以不断变化的;2.进程在运行期间,是可以不断的创造的;3.进程运行期间是可以请求若干可消耗性资源单元的,用于进程消耗,不再归还。可消耗性资源通常是由生产者进程创建,由消费者进程消耗,是典型的生产者-消费者问题。

​ 另外,还有就是可抢占性资源和不可抢占性资源。可抢占性资源如CPU、主存,进程获得后可被其他进程抢占,这类资源的竞争是不会引起死锁的;不可抢占性资源如磁带机、打印机,进程获得后,就不能强行回收,只能在进程使用完毕后自行释放。

​ 下面我们来看下死锁产生的原因:

  1. 竞争不可抢占性资源引起死锁:通常系统中所拥有的的不可抢占性资源的数量不足以满足多个进程的需要,使得进程在运行过程中,会因争夺资源而陷入僵局。例如,系统中只有一台打印机R1和一台读卡机R2,可供进程P1和P2共享,如果P1申请到R1,P2申请到R2,同时P1还需申请R2、P2还需申请R1,即形成资源申请环路,这样会产生死锁,如下图所示。
死锁概述---定义、危害、必要条件和处理方法
  1. 竞争可消耗性资源引起死锁:这类问题主要是进程间接收消息和发送消息的顺序设置不当导致的,例如进程A、B间通信,假设两个进程等在等待对方的消息,但是因为谁都没有发送消息,所以两个进程就会一直处于等待接收消息,而进程无法顺利的执行下去。就好像两个武林高手一直在等对方先出招,最终。。。
  2. 进程推进顺序不当引起死锁:除了多个进程对资源的竞争会引发死锁外,进程在运行过程中,对资源进行申请和释放的顺序是否合法,也是会引起死锁的。个人认为进程推进顺序不当的根本原因还是竞争不可抢占资源,还是以进程P1、P2竞争R1、R2为例,进程P1的伪代码为:P(R1)–>P(R2)–>do something–>V(R1)–>V(R2),进程P2的伪代码为:P(R2)–>P(R1)–>do something–>V(R2)–>V(R1),如果P1和P2在某一时刻分别申请到了R1和R2,那么就会形成资源申请环路,发生死锁。

4.死锁产生的必要条件

​ 通过上面的分析,不难看出,死锁的产生是需要一定的条件的,下面我们一起来看下:

  1. 互斥条件:进程对所分配到的资源进行排它性使用,在一段时间内,某资源只能被一个进程占用,也就是说临界资源;
  2. 请求和保持条件:进程已经保持了至少一个资源,但是又提出了新的资源请求,而新的资源申请不到,此时进程被阻塞,但是不会释放自己已经占用的资源;
  3. 不可抢占条件:进程已获得的资源在未使用完成之前不能被抢占,只能在进程使用完后自己释放;
  4. 循环等待条件:也称为环路条件,即在发生死锁时,必然存在一个进程----资源的循环链,即上图中的环形图。

​ 死锁的产生必须同时满足上面四个必要条件,只要其中一个不满足,死锁就不会发生,这也给我们处理死锁问题带来了思路。

5.处理死锁的方法

​ 目前处理死锁的方法可归结为四种:

  1. 预防死锁:通过设置某些限制条件,去破坏产生死锁四个必要条件的一个或几个来预防产生死锁,这种策略也是比较简单和直观的,也比较容易实现;
  2. 避免死锁:与破坏四个必要条件不同,避免死锁是在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免发生死锁,有点像中国孟子所说,君子不立危墙之下;
  3. 检测死锁:实现不采取任何限制措施,允许进程在运行过程中发生死锁,但可通过检测机构及时检测死锁的发生,然后采取适当措施解除死锁;
  4. 解除死锁:与检测死锁相关联,发生死锁时采取相应措施,将进程从死锁状态中解脱出来。

​ 上述的四种方法,从1到4对死锁的预防程度逐渐减弱,但对应的是资源利用率的提高和操作系统并发程度的提高。

​ 因为篇幅问题,就不把所有的知识点放到一篇博客中了,关于预防死锁和避免死锁的描述,还请参考后面两篇博客。

​ 又到了分隔线以下,本文到此就结束了,本文内容全部都是由博主自己进行整理并结合自身的理解进行总结,如果有什么错误,还请批评指正。

​ 如有兴趣,还可以查看我的其他几篇博客,都是OS的干货,喜欢的话还请点赞、评论加关注^_^。

继续阅读