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

一.什么是死锁?

   死锁是由于两个或以上的线程互相持有对方需要的资源,导致这些线程处于等待状态,无法执行。

二.产生死锁的四个必要条件

   1.互斥性:线程对资源的占有是排他性的,一个资源只能被一个线程占有,直到释放。

   2.请求和保持条件:一个线程对请求被占有资源发生阻塞时,对已经获得的资源不释放。

   3.不剥夺:一个线程在释放资源之前,其他的线程无法剥夺占用。

   4.循环等待:发生死锁时,线程进入死循环,永久阻塞。

三.产生死锁的原因

   1.竞争不可抢占性资源

    p1已经打开F1,想去打开F2,p2已经打开F2,想去打开F1,但是F1和F2都是不可抢占的,这是发生死锁。

   2.竞争可消耗资源引起死锁

    进程间通信,如果顺序不当,会产生死锁,比如p1发消息m1给p2,p1接收p3的消息m3,p2接收p1的m1,发m2给p3,p3,以此类推,如果进程之间是先发信息的那么可以完成通信,但是如果是先接收信息就会产生死锁。

   3.进程推进顺序不当

    进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。

四.避免死锁的方法

   1.破坏“请求和保持”条件

    想办法,让进程不要那么贪心,自己已经有了资源就不要去竞争那些不可抢占的资源。比如,让进程在申请资源时,一次性申请所有需要用到的资源,不要一次一次来申请,当申请的资源有一些没空,那就让线程等待。不过这个方法比较浪费资源,进程可能经常处于饥饿状态。还有一种方法是,要求进程在申请资源前,要释放自己拥有的资源。

   2.破坏“不可抢占”条件

    允许进程进行抢占,方法一:如果去抢资源,被拒绝,就释放自己的资源。方法二:操作系统允许抢,只要你优先级大,可以抢到。

   3.破坏“循环等待”条件

    将系统中的所有资源统一编号,进程可在任何时刻提出资源申请,但所有申请必须按照资源的编号顺序(升序)提出

五.死锁的检测

  1.每个进程、每个资源制定唯一编号

  2.设定一张资源分配表,记录各进程与占用资源之间的关系

  3.设置一张进程等待表,记录各进程与要申请资源之间的关系  

资源分配表

资源 进程
r1 p2
r2 p5
r3 p4
r4 p1

                 进程等待表

资源 进程
p1 r1
p2 r3
p4 r4

    p1-r1-p2-r3-p4-r4-p1 出现环路引起死锁

六.死锁的解除

  1.抢占资源,从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以解除死锁状态。

  2.终止(或撤销)进程,终止(或撤销)系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态解脱出来.

原文地址:https://www.cnblogs.com/JimmyFanHome/p/9914562.html

时间: 2024-11-02 09:55:57

死锁产生的原因以及解决方法的相关文章

Oracle常见死锁发生的原因以及解决方法

Oracle常见死锁发生的原因以及解决办法 一,删除和更新之间引起的死锁 造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖.这里列举一个对同一个资源的争抢造成死锁的实例. Oracle 10g, PL/SQL version 9.2 CREATE TABLE testLock(  ID NUMBER, test VARCHAR(100)  ) COMMIT INSERT INTO testLock VALUES(1,'test1'); INSERT INTO testLock VAL

mysql数据库死锁的产生原因及解决办法

这篇文章主要介绍了mysql数据库锁的产生原因及解决办法,需要的朋友可以参考下 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁是实现数据库并 发控制的一个非常重要的技术.在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行. 在数据库中有两种基本的锁类型

coreseek常见错误原因及解决方法

coreseek常见错误原因及解决方法 Coreseek 中文全文检索引擎 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和信息处理领域,适用于行业/垂直搜索.论坛/站内搜索.数据库搜索.文档/文献检索.信息检索.数据挖掘等应用场景,用户可以免费下载使用 本文为大家整理了coreseek/sphinx中文检索引擎的常见问题和解决方法,感兴趣的同学参考下. Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协

解析Win8小键盘灯不亮的原因及解决方法      

相信不少用户安装win8.1系统后发现,每次电脑开机小键盘灯都不亮,导致无法使用小键盘,需要手动按Num lock键才能打开数字小键盘输入.虽然,问题不大,但每次都要重复这样的动作感觉很烦.有没有办法解决这个问题呢?其实,只需要修改注册表就能搞定. 按"win+R"快捷键打开运行对话框,输入"regedit"命令,打开注册表编辑器,依次找到"HKEY_USERS→.DEFAULT→Control Panel→Keyboard",将其右边的&quo

Hyper-V虚拟机启动时报“账户没有足够的权限打开VHD文件”原因及解决方法

前段时间,准备做一套Exchange Server 2010仿真环境,用于后期企业内各项变更及平台上线时测试工作,由于需要准备的服务器较多,一台一台装虚机,感谢非常费时间,所以想到,做一个模版来快速完成虚拟机部署工作,大概的过程我想大家也有做过,就是装一台Hyper-V虚机,然后把VHD硬盘文件拷贝出来,分别替换所有建好没有系统的虚拟机硬盘,看似简单,但是在实际操作时发现,模版硬盘没有被识别?各种报错,如下图所示: 当看到上图所示这些报错时,很不理解,已经将这台机器的VHD文件指向了新拷入的模版

关于MySQL错误 2005 - Unknown MySQL server host 'localhost' (0) 原因及解决方法

今天在外面开navicat for mysql的时候,怎么也连不上自己本机上的数据库,一直显示2005 - Unknown MySQL server host 'localhost' (0): 错误代码的意思即无法连接上主机localhost.可能是由于没有联网造成的:于是将连接属性里的 '主机名或IP地址' 改成127.0.0.1即回送地址后,就可以连接上了.上百度搜了下,navicat里的一些功能应该是要联网的,而localhost是需要DNS解析后才会是127.0.0.1的,所以才会导致这

使用 ADOX 将 Table 添加到 Catalog 时报“类型无效”的原因和解决方法

http://blog.csdn.net/kfhzy/article/details/6020283 http://blog.csdn.net/kfhzy/article/details/6020545 李维的代码,原来链接的是MS SQL,改成ACCESS后,报 类型无效 错误 原因 除了 adDBTimeStamp 这样的 明显不支持的数据类型外,一般的,也有区别,adVarChar 在ACCESS里是adVarWChar procedure TfrmCreateTable.btnCreat

php教程之php空白页的原因及解决方法

php中出现空白页的原因及解决方法汇总. 很多程序员在进行php开发的时候都遇到过出现空白页的请,综合分析来说,在php编程中出现空白页面可能是由以下几个原因造成的: 1.逻辑错误逻辑错误是最难排除的,从表面上看,也许代码是合法的,是正规的,可运行起来却不是预料之中的.很多php教程中均有提及这方面的内容.为什么呢?也许是编写者想得不够全面,毕竟人是人,计算机是计算机,计算机不可能完全按照人的思路去运行脚本.一个比较好的调试方法,就是使用注释符“/* */”,注释掉一些代码,观察运行情况,以此来

Java并发编程:Java ConcurrentModificationException异常原因和解决方法

Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论以下这个异常出现的原因以及解决办法. 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三.在多线程环境下的解决方法 若有不