`
AutomaticThoughts
  • 浏览: 162314 次
社区版块
存档分类
最新评论

死锁是什么

    博客分类:
  • Java
 
阅读更多

在并发程序设计中,死锁 (deadlock) 是一种十分常见的逻辑错误。通过采用正确的编程方式,死锁的发生不难避免。

死锁的四个必要条件

在计算机专业的本科教材中,通常都会介绍死锁的四个必要条件。这四个条件缺一不可,或者说只要破坏了其中任何一个条件,死锁就不可能发生。我们来复习一下,这四个条件是:
•互斥(Mutual exclusion):存在这样一种资源,它在某个时刻只能被分配给一个执行绪(也称为线程)使用;
•持有(Hold and wait):当请求的资源已被占用从而导致执行绪阻塞时,资源占用者不但无需释放该资源,而且还可以继续请求更多资源;
•不可剥夺(No preemption):执行绪获得到的互斥资源不可被强行剥夺,换句话说,只有资源占用者自己才能释放资源;
•环形等待(Circular wait):若干执行绪以不同的次序获取互斥资源,从而形成环形等待的局面,想象在由多个执行绪组成的环形链中,每个执行绪都在等待下一个执行绪释放它持有的资源。



解除死锁的必要条件

不难看出,在死锁的四个必要条件中,第二、三和四项条件比较容易消除。通过引入事务机制,往往可以消除第二、三两项条件,方法是将所有上锁操作均作为事务对待,一旦开始上锁,即确保全部操作均可回退,同时通过锁管理器检测死锁,并剥夺资源(回退事务)。这种做法有时会造成较大开销,而且也需要对上锁模式进行较多改动。

消除第四项条件是比较容易且代价较低的办法。具体来说这种方法约定:上锁的顺序必须一致。具体来说,我们人为地给锁指定一种类似“水位”的方向性属性。无论已持有任何锁,该执行绪所有的上锁操作,必须按照一致的先后顺序从低到高(或从高到低)进行,且在一个系统中,只允许使用一种先后次序。

请注意,放锁的顺序并不会导致死锁。也就是说,尽管按照 锁A, 锁B, 放A, 放B 这样的顺序来进行锁操作看上去有些怪异,但是只要大家都按先A后B的顺序上锁,便不会导致死锁。
举例

假如有三个对象A、B、C,我们人为约定它们的锁序是: A 先于 B 先于 C。举例说来,下列锁序均为合法:
•      锁C,放C
•      锁B,放B
•      锁B,锁C,放B,放C
•      锁B,锁C,放C,放B
•      锁A,放A
•      锁A,锁C,放A,放C
•      锁A,锁C,放C,放A
•      锁A,锁B,放A,放B
•      锁A,锁B,放B,放A
•      锁A,锁B,锁C,放A,放B,放C
•      锁A,锁B,锁C,放C,放B,放A


而在上面定义的系统中,可能导致发生死锁典型上锁序列包括:
•      锁B,锁A,锁C,放C,放A,放B


(因为先B后A的上锁顺序违反了锁序约定,如果另一执行绪同时按照先A后B的顺序上锁,则可能由于执行绪甲获得了B,执行绪乙获得了A,而导致双方同时等待对方释放所持有的锁,从而形成死锁局面;解法是将操作序列中增加适当的锁操作,即改为锁B,放B,锁A,锁B,锁C,放C,放A,放B)

或者说,只要拿锁的时候不出现逆序(例如拿着C的时候试图抓B或A,或者拿着B的时候试图抓A),并出现潜在逆序的时候先放掉“小”锁再抓大的,就一定不造成死锁了。

分享到:
评论

相关推荐

    操作系统-死锁

    从进程同步的概念可以知道,当并发进程需要竞争使用资源或需要相互协作向前推进时,如果不采取同步措施,或同步措施不恰当,则很容易导致并发进程不能向前推进而陷入僵局,即死锁现象。死锁是发生在一组相互竞争或...

    进程线程及死锁

    通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。

    java死锁源码java死锁源码

    java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁...

    解决ORACLE死锁问题

    一、数据库死锁的现象 程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。 二、死锁的原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 交,另一条对于这一列...

    死锁详解,如何表面死锁

    死锁详解,详细的为你讲解什么事死锁,如何克服死锁。

    postgresql查询死锁以及杀死死锁进程sql.txt

    查询sql的死锁进程,查找并杀死。解决生产数据库中卡死的现象。postgresql查询死锁以及杀死死锁进程sql

    死锁检测源代码

    死锁检测源代码

    oracle-死锁查询

    oracle死锁问题查询代码,仅供参考,有问题大家一起交流

    操作系统-死锁.pptx

    第7讲 进程死锁 2022/6/20 2 今日主题 什么是死锁?(了解) 死锁防止(熟悉) 死锁避免(掌握) 死锁检测和恢复(熟悉) [重点]:死锁必要条件、死锁防止、避免、检测和恢复 [难点]:银行家算法。 操作系统-死锁...

    什么是死锁.xmind

    什么是死锁

    Java面试-彻底搞懂死锁的前世今生

    本文就什么是死锁?怎么找到死锁?怎么解决死锁?怎么避免死锁等问题展开分析,通过大量的代码和案例演示向大家描述死锁的前世今生。 快速到达看这里死锁是什么,有什么危害?写一个死锁的例子案例一:必然发生死锁...

    oracle解锁,死锁

    oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁

    浅谈死锁(Linux操作系统)

    死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于...

    MySQL死锁的产生原因以及解决方案

    在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行。 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁...

    死锁典型例题,对理解死锁的计算类题目有帮助

    死锁典型例题,对理解死锁的计算类题目有帮助

    数据库死锁-解决死锁问题的三种办法

    解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。

    操作系统实验六 死锁问题实验

    操作系统实验六:死锁问题实验报告。通过本实验观察死锁产生的现象,考虑解决死锁问题的方法。从而进一步加深对于死锁问题的理解。掌握解决死锁问题的几种算法的编程和调试技术。练习怎样构造管程和条件变量,利用...

    sql数据库死锁查询工具

    数据库死锁,阻塞查询,杀死死锁,阻塞进程

    多线程死锁

    明白死锁产生的原因,在程序中演示死锁产生并从而实现多线程陈旭解决死锁(deadlock)这一类问题。

    车辆行驶死锁问题

    车辆行驶死锁问题,在Linux下用C语言完成下面模型:设有一个T型路口,其中A,B,C,D各处可容纳一辆车,车型方向如图所示。找出死锁并用有序分配法消除之,要求资源编号合理。

Global site tag (gtag.js) - Google Analytics