什么是死锁和如何解决死锁

资源的分类

系统中有许多不同类型的资源,需要采用互斥访问方法并且不可被抢占的资源,也就是临界资源。

目录

资源的分类

使用次数分类

能否抢占分类

死锁(Deadlock)的形成

竞争不可抢占资源引起死锁

竞争可消耗资源引起死锁

进程推进顺序不当引起死锁

产生死锁的必要条件

互斥条件

请求和保持条件

不可抢占条件

循环等待条件

处理死锁的思路。

预防死锁方法

协议1

协议2


使用次数分类

可重用性资源

每一个可重用资源中的单元只能分配给一个进程使用,不允许多个进程共享。进程是用资源顺序,1 请求资源,如果请求失败进程阻塞或循环等待。2 使用资源。3释放资源。

系统中的可重用资源数目都是相对固定的程序运行时不能增加或删除。

消耗性资源

他是临时资源,有进程运行动态创建和消耗的,每一类消耗性资源单元数目都是不断变化的,通常在生产者进程中创建,在消费者进程中消耗。

能否抢占分类

可抢占资源

CPU,主存等可以共享的资源。

不可抢占资源

打印机,光驱等不可共享的资源。

死锁(Deadlock)的形成

打个比方,假设有P1和P2两个进程,都需要A和B两个资源,现在P1持有A等待B资源,而P2持有B等待A资源,两个都等待另一个资源而不肯释放资源,就这样无限等待中,这就形成死锁,这也是死锁的一种情况。给死锁下个定义,如果一组进程中每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。

竞争不可抢占资源引起死锁

也就是我们说的第一种情况,而这都在等待对方占有的不可抢占的资源。

竞争可消耗资源引起死锁

有p1,p2,p3三个进程,p1向p2发送消息并接受p3发送的消息,p2向p3发送消息并接受p2的消息,p3向p1发送消息并接受p2的消息,如果设置是先接到消息后发送消息,则所有的消息都不能发送,这就造成死锁。

进程推进顺序不当引起死锁

有进程p1,p2,都需要资源A,B,本来可以p1运行A --> p1运行B --> p2运行A --> p2运行B,但是顺序换了,p1运行A时p2运行B,容易发生第一种死锁。互相抢占资源。

产生死锁的必要条件

互斥条件

某资源只能被一个进程使用,其他进程请求该资源时,只能等待,知道资源使用完毕后释放资源。

请求和保持条件

程序已经保持了至少一个资源,但是又提出了新要求,而这个资源被其他进程占用,自己占用资源却保持不放。

不可抢占条件

进程已获得的资源没有使用完,不能被抢占。

循环等待条件

必然存在一个循环链。

处理死锁的思路。

预防死锁

破坏死锁的四个必要条件中的一个或多个来预防死锁。

避免死锁

和预防死锁的区别就是,在资源动态分配过程中,用某种方式防止系统进入不安全的状态。

检测死锁

运行时出现死锁,能及时发现死锁,把程序解脱出来

解除死锁

发生死锁后,解脱进程,通常撤销进程,回收资源,再分配给正处于阻塞状态的进程。

预防死锁方法

破坏请求和保持条件

协议1

所有进程开始前,必须一次性地申请所需的所有资源,这样运行期间就不会再提出资源要求,破坏了请求条件,即使有一种资源不能满足需求,也不会给它分配正在空闲的资源,这样它就没有资源,就破坏了保持条件,从而预防死锁的发生。

协议2

允许一个进程只获得初期的资源就开始运行,然后再把运行完的资源释放出来。然后再请求新的资源。

破坏不可抢占条件

当一个已经保持了某种不可抢占资源的进程,提出新资源请求不能被满足时,它必须释放已经保持的所有资源,以后需要时再重新申请。

破坏循环等待条件

对系统中的所有资源类型进行线性排序,然后规定每个进程必须按序列号递增的顺序请求资源。假如进程请求到了一些序列号较高的资源,然后有请求一个序列较低的资源时,必须先释放相同和更高序号的资源后才能申请低序号的资源。多个同类资源必须一起请求。

(0)

相关推荐

  • 小白科普:死锁

    什么叫死锁? 死锁指多个线程因竞争资源而造成的一种互相等待,若无外力作用,这些进程都将无法向前推进. 业务场景可以分为两大类,单用户业务和用户间业务,一般单用户业务很少出现死锁. 死锁的现象? 在DB ...

  • A407:贫穷为何会形成死锁状态?

    生活就如同一锅炖菜,如果你只挑肉吃,你就会觉得它全是肉.如果你只挑选菜吃,你就会觉得它全是菜,如果你专门挑葱蒜吃,你就会感觉它全是佐料,其它什么都没有! 我们把自己能够感知的世界称之为主观世界,我们的 ...

  • 【史迹攻略】九命护身死锁套

    猛男的最爱 文末有MTGA导入码 死锁的运作方式:两张牌的配合--九命护身+肃然致哀 九命护身让我们在受到伤害时,防止该伤害且在九命护身上放置一个转生指示物,问题在于当九命护身上有九个或更多转生指示物 ...

  • 咋办,死锁了

    突然发现我的图解系统缺了「死锁」的内容,这就来补下. 在面试过程中,死锁也是高频的考点,因为如果线上环境真多发生了死锁,那真的出大事了. 这次,我们就来系统地聊聊死锁的问题. 死锁的概念: 模拟死锁问 ...

  • Mysql 死锁引发的@Transactional 数据回滚

    Spring框架中我们经常使用 @Transactional 注解来做事务,但是事务并不能保证有效性: 以下是我遇到的问题,不一定完全正确,可以做个参考: 在一个类上标记了 @Transactiona ...

  •  项目中遇到的死锁问题 Lock wait timeout exceeded try restarting transaction

    最近项目中频繁出现  Lock wait timeout exceeded; try restarting transaction这个错误,把我们弄得痛苦不堪啊,为了解决问题,上网上找好多资料,终于把 ...

  • Java并发编程实战(4)- 死锁

    概述 在上一篇文章中,我们讨论了如何使用一个互斥锁去保护多个资源,以银行账户转账为例,当时给出的解决方法是基于Class对象创建互斥锁. 这样虽然解决了同步的问题,但是能在现实中使用吗?答案是不可以, ...

  • SQL Server-聚焦深入理解死锁以及避免死锁建议(三十三)

    前言 终于进入死锁系列,前面也提到过我一直对隔离级别和死锁以及如何避免死锁等问题模棱两可,所以才鼓起了重新学习SQL Server系列的勇气,本节我们来讲讲SQL Server中的死锁,看到许多文章都 ...

  • 死锁、活锁、饿死和阻塞的个人理解

    以下个人理解,请各位前辈多多指教: 死锁: ① 互斥条件:指进程对所分配到的资源进行排它性使用,在一段时间内某资源只由一个进程占用,如果此时还有其他进程请求资源,则请求者只能等待,直至占有资源的进程被 ...