当前位置: 首页 > news >正文

[<死锁专题>]

死锁专题

          • 1. 什么是死锁?
          • 2. 死锁产生的必要条件?
          • 3. 解决死锁的基本方法?

1. 什么是死锁?

死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 如下图所示:如果此时有一个线程 A,已经持有了锁 A,但是试图获取锁 B,线程 B 持有锁 B,而试图获取锁 A,这种情况下就会产生死锁。

2. 死锁产生的必要条件?
  1. 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
  2. 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
  4. 环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。

互请不还

3. 解决死锁的基本方法?
  1. 预防死锁----- 确保系统永远不会进入死锁状态

    破坏请求条件:一次性分配所有资源,这样就不会再有请求了;

    破坏保持条件:只要有一个资源得不到分配,也不给这个进程分配其他的资源:

    破坏不可剥夺条件:当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源;

    破坏环路等待条件:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反。

  2. 避免死锁----- 在使用前进行判断,只允许不会产生死锁的进程申请资源

    银行家算法:当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
    当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源。若没超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若满足则按当前的申请量分配资源,否则也要推迟分配。
    安全序列:是指系统能按某种进程推进顺序(P1, P2, P3, …, Pn),为每个进程 Pi 分配其所需要的资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺序地完成。这种推进顺序就叫安全序列【银行家算法的核心就是找到一个安全序列】。
    系统安全状态 :如果系统能找到一个安全序列,就称系统处于安全状态,否则,就称系统处于不安全状态。

  3. 检测死锁

  4. 解除死锁

资源剥夺:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他死锁进程(但应该防止被挂起的进程长时间得不到资源);

撤销进程:强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源(撤销的原则可以按进程优先级和撤销进程代价的高低进行);

进程回退:让一个或多个进程回退到足以避免死锁的地步。进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。

相关文章:

  • 想使用 MongoDB ,你应该了解这8个方面!
  • 你知道那些常用的设计模式?
  • 百度地图2.0瓦片地址获取(窗口内瓦片)
  • 设计模式的六大原则?
  • 小知识点
  • 如何做“足够好”的软件
  • 如何理解设计模式的六大原则?
  • 设计模式的分类
  • 盲并遗忘着-利用应用交付透析大型网站日志
  • 请手写一下单例模式?
  • ArrayList
  • python 遗传算法精简版
  • B-树和B+树区别
  • 红黑树
  • 负载均衡之基于L3/4负载
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Android开源项目规范总结
  • Angularjs之国际化
  • IDEA常用插件整理
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • quasar-framework cnodejs社区
  • React的组件模式
  • Selenium实战教程系列(二)---元素定位
  • Spring Cloud中负载均衡器概览
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 测试开发系类之接口自动化测试
  • 从零开始的无人驾驶 1
  • 诡异!React stopPropagation失灵
  • 警报:线上事故之CountDownLatch的威力
  • 开发基于以太坊智能合约的DApp
  • 前端学习笔记之观察者模式
  • 深入浅出webpack学习(1)--核心概念
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 协程
  • 与 ConTeXt MkIV 官方文档的接驳
  • 2017年360最后一道编程题
  • 阿里云服务器如何修改远程端口?
  • 阿里云重庆大学大数据训练营落地分享
  • 通过调用文摘列表API获取文摘
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • !!Dom4j 学习笔记
  • # Java NIO(一)FileChannel
  • #pragma pack(1)
  • #pragma 指令
  • #QT项目实战(天气预报)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (java)关于Thread的挂起和恢复
  • (七)c52学习之旅-中断
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版