死锁产生的四个必要条件?如何避免和预防死锁产生?

2023-05-16

一、什么是死锁?

两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中,这就是死锁。

举个例子:如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A进行加锁,这时死锁就发生了。线程1永远得不到B,线程2也永远得不到A,并且它们永远也不会知道发生了这样的事情。为了得到彼此的对象(A和B),它们将永远阻塞下去。这种情况就是一个死锁。

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

互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。

循环等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立(即必要不充分条件),而只要上述条件之一不满足,就不会发生死锁。

三、死锁产生的原因:

1.系统资源的竞争

当系统中供多个进程共享的资源如打印机、公用队列的等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。

2.进程运行推进顺序不当引起死锁

● 进程推进顺序合法   当进程P1和P2并发执行时,如果按照下述顺序推进:P1:Request(R1);
P1:Request(R2); P1: Relese(R1);P1: Relese(R2); P2:Request(R2);
P2:Request(R1); P2: Relese(R2);P2:
Relese(R1);这两个进程便可顺利完成,这种不会引起进程死锁的推进顺序是合法的。   
● 进程推进顺序非法
  若P1保持了资源R1,P2保持了资源R2,系统处于不安全状态,因为这两个进程再向前推进,便可能发生死锁。例如,当P1运行到P1:Request(R2)时,将因R2已被P2占用而阻塞;当P2运行到P2:Request(R1)时,也将因R1已被P1占用而阻塞,于是发生进程死锁。

四、如何避免和预防死锁产生

死锁避免的基本思想:系统对进程发出每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配。这是一种保证系统不进入死锁状态的动态策略。

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。只要打破四个必要条件之一就能有效预防死锁的发生:

打破互斥条件:改造独占性资源为虚拟资源,大部分资源已无法改造。

打破不可抢占条件:当一进程占有一独占性资源后又申请一独占性资源而无法满足,则退出原占有的资源。

打破占有且申请条件:采用资源预先分配策略,即进程运行前申请全部资源,满足则运行,不然就等待,这样就不会占有且申请。

打破循环等待条件:实现资源有序分配策略,对所有设备实现分类编号,所有进程只能采用按序号递增的形式申请资源。

在这里插入图片描述

五、死锁避免和死锁预防的区别

死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现;而死锁避免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁。死锁避免是在系统运行过程中注意避免死锁的最终发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

死锁产生的四个必要条件?如何避免和预防死锁产生? 的相关文章

随机推荐

  • C++类的运算符重载

    11 8 类的运算符重载 运算符重载是一种形式的C 43 43 多态 运算符重载将充值该的概念扩展到运算符上 xff0c 允许赋予C 43 43 运算符多种含义 C 43 43 允许将运算符重载扩展到用户定义类型 xff0c 例如 xff0
  • qgc通过mavros连接到Pixhawk飞控

    qgc通过mavros连接到Pixhawk飞控 mavros设置QGC设置 mavros确实是一个不错的工具 xff0c 在机载电脑上进行无人机开发的时候 xff0c 有时候想调飞控的参数看一下飞控的一些信息 xff0c 但是直接接飞控又不
  • 【视觉 SLAM】2D-2D:对极几何

    本文为视觉 SLAM 学习总结 xff0c 讲解 2D 2D 对极几何 欢迎交流 理论 现在相机得到了两张图片 xff08 通常为初始帧和第二帧 xff09 xff0c 已知两张图片中的像素坐标点和特征点的匹配关系 xff0c 已知相机内参
  • C调用python生成的so动态库

    目标 python代码实现的功能 xff0c 转成so动态链接库库 xff0c 然后被C语言调用 环境 ubuntu 18 04 思路 写一个pyx xff0c 用Cython生成so xff0c 写一个main c调用so 过程记录 写
  • 树莓派连接电源时,红灯常亮,绿灯连续闪两下后一直灭的问题

    可能原因 xff1a 1 解压途径不正确 IMG不能用RAR软件解压 xff0c 要用7ZIP xff08 官网有 xff1a 7ZIP xff09 用7ZIP解压 xff0c 然后重新刷系统 2 可能是SPI EEPROM的问题 xff0
  • 树莓派不能上网的可能原因以及解决方法

    不能上网的具体表现为树莓派的Web浏览器不能进入百度 xff0c 且运行sudo apt get update指令会报错 xff0c 提示 暂时不能解析域名 在百度上尝试了很多办法 xff0c 比如在 etc resolv conf文件中修
  • 树莓派4B学习笔记(3)—— 原理图与设置界面

    一 树莓派4B介绍 戳这里获取原理图 目前树莓派4只支持 xff0c 2019年7月10日发布的新系统raspbian buster xff0c 有精简版和全功能版 对于之前任何能与树莓派3兼容的系统 xff0c 树莓派4一概不支持 树莓派
  • 机器人正运动学(2)—— 自由度

    目录 1 自由度的定义2 自由度的计算2 1 刚体的自由度2 2 运动副2 3 自由度算例 3 总结 1 自由度的定义 自由度在很多领域中会出现 xff0c 对于机器人而言 xff0c 我们这里谈的也就是机构的自由度 任何一台机器人都可以认
  • 机器人正运动学(8)—— DH坐标系建立技巧

    目录 1 引言2 建立DH坐标系的技巧2 1 理清关节和连杆2 2 画 z 轴2 3 确定 x 轴2 3 1 x轴方向2 3 2 x轴起始点 xff08 坐标系原点 xff09 2 4 小结 3 总结 1 引言 关于DH参数上一篇文章介绍了
  • ROS 学习笔记(13)—— 常用可视化工具的使用

    常用可视化工具的使用 1 QT 工具箱1 1 日志输出工具 rqt console1 2 数据绘图工具 rqt plot1 3 图像渲染工具 rqt image view1 4 计算图可视化工具 rqt graph1 5 综合工具 rqt
  • 树莓派4B安装 ubuntu20.04 & VNC远程桌面 & 安装ROS noetic

    树莓派4B安装 ubuntu20 04 amp VNC远程桌面 amp 安装ROS noetic 1 安装ubuntu方式1 xff1a 下载Imager文件 方式2 xff1a 下载镜像文件 2 查询树莓派 IP 地址3 使用ssh远程登
  • ROS踩坑记录

    ROS踩坑记录 问题 xff1a ubuntu 没有 dev ttyUSB0问题 xff1a 运行 launch 文件或 ROS 节点时出现 exit code 9 错误提示问题 xff1a windows使用vscode远程连接 xff0
  • ROS中的分布式通讯(树莓派与虚拟机)

    ROS中的分布式通讯 xff08 树莓派与虚拟机 xff09 一 前言二 树莓派连接WIFI三 查找局域网下的其他设备 IP四 确定可以ping通五 配置文件修改六 配置主机 IP七 配置从机 IP八 测试九 可能会遇到的问题 一 前言 在
  • Laravel Passport-不支持授予类型("error": "unsupported_grant_type")

    如果你在Laravel里使用Passport授权验证的时候出现 xff1a span class token punctuation span span class token double quoted string string 34
  • NanoPi M4开发opencv图像识别aruco码全过程(超详细)(一:搭环境)

    NanoPi M4介绍 NanoPi M4是基于RK3399 SoC设计的一款接口尺寸与树莓派3兼容的嵌入式ARM计算机 它的尺寸只有85x56mm xff0c 接口丰富 布局紧凑 非常适合二次开发 并方便嵌入到最终产品中去 NanoPi
  • NanoPi M4开发opencv图像识别aruco码全过程(超详细)(二:测试)

    进入 usr local bin 这里是aruco提供的一些测试案例 xff0c 可执行文件 这里我们用这些例程来测试是否opencv及aruco是否安装完好并且可执行 1 相机标定 1 1先打印生成标定板 在https sourcefor
  • NanoPi M4开发opencv图像识别aruco码全过程(超详细)(二:测试补充)

    一 ArUco项目源码简析 声明 xff1a 以下内容均是在虚拟机Ubuntu系统下进行操作 xff0c 用开发板Nano Pi的同学亦可同样实现 xff0c 但这里为了方便截图以及界面复制 1 首先来看一下ArUco项目的源码结构 bin
  • 麻将清一色判和

    麻将清一色判和 C语言 题目示例 题目 是这样的 xff0c 雀儿最近迷上了打麻将 但是她不知道怎么才能清一色和牌 麻将的清一色和牌规则是 xff1a 雀儿手里有13张同一类型的牌 xff08 万 筒或索中的一种 xff0c 从1到9 xf
  • 改变世界的五位顶级程序员!

    点击上方 Java基基 xff0c 选择 设为星标 做积极的人 xff0c 而不是积极废人 xff01 源码精品专栏 原创 Java 2020 超神之路 xff0c 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析网络应用框
  • 死锁产生的四个必要条件?如何避免和预防死锁产生?

    一 什么是死锁 xff1f 两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁 结果就是这些线程都陷入了无限的等待中 xff0c 这就是死锁 举个例子 xff1a 如果线程1锁住了A xff0c 然后尝试对B进行加