死锁的四个必要条件以及处理策略

2023-05-16

一、什么是死锁
死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局。

例如,某计算机系统中只有一台打印机和一台输入设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。

关于死锁的一些结论:

参与死锁的进程数至少为两个;
参与死锁的所有进程均等待资源;
参与死锁的进程至少有两个已经占有资源;
死锁会浪费大量系统资源,甚至导致系统崩溃;

二、产生死锁的四个必要条件
1、 互斥条件
进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

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

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

4、循环等待条件:
存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。即存在一个处于等待状态的进程集合{Pl, P2, …, pn},其中Pi等 待的资源被P(i+1)占有(i=0, 1, …, n-1),Pn等待的资源被P0占有,如图2-15所示。

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


六、处理死锁的方法
预防死锁:通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个条件,来防止死锁的发生。
避免死锁:在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁的发生。
检测死锁:允许系统在运行过程中发生死锁,但可设置检测机构及时检测死锁的发生,并采取适当措施加以清除。
解除死锁:当检测出死锁后,便采取适当措施将进程从死锁状态中解脱出来。

6.1 预防死锁
破坏“互斥”条件:
就是在系统里取消互斥。若资源不被一个进程独占使用,那么死锁是肯定不会发生的。但一般来说在所列的四个条件中,“互斥”条件是无法破坏的

破坏“占有并等待”条件:
破坏“占有并等待”条件,就是在系统中不允许进程在已获得某种资源的情况下,申请其他资源。即要想出一个办法,阻止进程在持有资源的同时申请其他资源。
方法一:一次申请所需的全部资源,即 “ 一次性分配”。
方法二:要求每个进程提出新的资源申请前,释放它所占有的资源。即“先释放后申请”。

破坏“不可抢占”条件:
破坏“不可抢占”条件就是允许对资源实行抢夺。
方法一:占有某些资源的同时再请求被拒绝,则该进程必须释放已占有的资源,如果有必要,可再次请求这些资源和另外的资源。
方法二:设置进程优先级,优先级高的可以抢占资源

破坏“循环等待”条件:
将系统中的所有资源统一编号,所有进程必须按照资源编号顺序提出申请

6.2 避免死锁
加锁顺序:线程按照一定的顺序加锁。
加锁时限:线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁。
死锁检测:每当一个线程获得了锁,会在线程和锁相关的数据结构中(map、graph等等)将其记下。除此之外,每当有线程请求锁,也需要记录在这个数据结构中。

6.3 检测死锁
一般来说,由于操作系统有并发,共享以及随机性等特点,通过预防和避免的手段达到排除死锁的目的是很困难的。这需要较大的系统开销,而且不能充分利用资源。为此,一种简便的方法是系统为进程分配资源时,不采取任何限制性措施,但是提供了检测和解脱死锁的手段:能发现死锁并从死锁状态中恢复出来。因此,在实际的操作系统中往往采用死锁的检测与恢复方法来排除死锁

例如:
进程P1占有资源R1而申请资源R2,进程P2占有资源R2而申请资源R1,按循环等待条件,进程和资源形成了环路,所以系统是死锁状态。进程P1,P2是参与死锁的进程。
下面我们再来看一看死锁检测算法。算法使用的数据结构是如下这些:
占有矩阵A:n*m阶,其中n表示并发进程的个数,m表示系统的各类资源的个数,这个矩阵记录了每一个进程当前占有各个资源类中资源的个数。
申请矩阵R:n*m阶,其中n表示并发进程的个数,m表示系统的各类资源的个数,这个矩阵记录了每一个进程当前要完成工作需要申请的各个资源类中资源的个数。
空闲向量T:记录当前m个资源类中空闲资源的个数。
完成向量F:布尔型向量值为真(true)或假(false),记录当前n个并发进程能否进行完。为真即能进行完,为假则不能进行完。
临时向量W:开始时W:=T。
算法步骤:
(1)W:=T,
对于所有的i=1,2,…,n,
如果A[i]=0,则F[i]:=true;否则,F[i]:=false
(2)找满足下面条件的下标i:
F[i]:=false并且R[i]〈=W
如果不存在满足上面的条件i,则转到步骤(4)。
(3)W:=W+A[i]
F[i]:=true
转到步骤(2)
(4)如果存在i,F[i]:=false,则系统处于死锁状态,且Pi进程参与了死锁。什么时候进行死锁的检测取决于死锁发生的频率。如果死锁发生的频率高,那么死锁检测的频率也要相应提高,这样一方面可以提高系统资源的利用率,一方面可以避免更多的进程卷入死锁。如果进程申请资源不能满足就立刻进行检测,那么每当死锁形成时即能被发现,这和死锁避免的算法相近,只是系统的开销较大。为了减小死锁检测带来的系统开销,一般采取每隔一段时间进行一次死锁检测,或者在CPU的利用率降低到某一数值时,进行死锁的检测。

6.4 解除死锁
资源剥夺法:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。
撤销进程法:强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。
进程回退法:让一(多)个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。
 

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

死锁的四个必要条件以及处理策略 的相关文章

  • ubuntu 常用命令汇总

    安装 sudo apt get install vim sudo apt get install nano 卸载 sudo apt get remove nano 给root用户设置密码 sudo passwd root 切换到root用户
  • 多任务学习-An Overview of Multi-Task Learning in Deep Neural Networks论文笔记

    An Overview of Multi Task Learning in Deep Neural Networks论文笔记 概述 xff1a 多任务学习有很多形式 xff0c 如联合学习 xff08 Joint Learning xff0
  • 结构体

    结构体 xff1a 结构是一些值的集合 xff0c 这些值称为成员变量 xff0c 每个成员可以是不同的类型变量 结构体成员的类型 xff1a 可以是 xff1a 标量 xff0c 数组 xff0c 指针 xff0c 结构体 struct
  • 【ROS-3】ROS实现图像目标检测

    1 darknet ros下载及编译 GitHub leggedrobotics darknet ros YOLO ROS Real Time Object Detection for ROS 直接下载zip就行 xff0c 解压到ros环
  • MapReduce实现基本SQL操作的原理

    Join的实现原理 select u name o orderid from order o join user u on o uid 61 u uid 在map阶段的输出中给每个value一个tag xff0c 用于区分数据来源 xff0
  • raw、qcow2、vmdk等虚拟机的镜像格式

    云计算用一个朋友的话来说 做云计算最苦逼的就是得时时刻刻为一些可能一辈子都碰不到的事做好准备 更苦逼的就是刚以为一个问题不会遇到 xff0c 立刻就发生了 这个还真的没有办法 xff0c 谁让哥我是搞云计算的呢 xff0c 简单一个虚拟化就
  • 树莓派3b安装win10的桌面版操作系统

    https www vediotalk com p 61 1999 目录 显示 国内播放节点 视频介绍 树莓派3b可以安装win10的桌面版操作系统 xff0c 大家也想体验的下 xff0c 不妨可以安装试试 xff0c 当然这并不能代替我
  • 无人机学习笔记之遥控篇

    遥控器 以LiteRadio 2c SE为例 1 遥控器按键 2 相关参数 3 遥控器工作原理 遥控器想要达到与无人机通信的功能需要有两部分配合完成 即 xff1a 发射器与接收机 遥控器上的控制杆转为无线电波发送给接收机 xff0c 而接
  • 二分类算法

    数据来源 xff1a 选自UCI机器学习库中的 银行营销数据集 Bank Marketing Data Set 算法完成目标 xff1a 这些数据与葡萄牙银行机构的营销活动相关 这些营销活动以电话为基础 xff0c 一般 xff0c 银行的
  • 防抖,节流 js

    概念 xff1a 函数防抖 debounce xff1a 触发高频事件后n秒内函数只会执行一次 xff0c 如果n秒内高频事件再次被触发 xff0c 则重新计算时间 函数节流 throttle xff1a 高频事件触发 xff0c 但在n秒
  • 如何远程访问Docker容器中的图形界面,如:kettle

    kettle是一个免费开源的 可视化的 功能强大的ETL工具 一般为了部署方便 xff0c 通常都部署在docker容器中 xff0c 那么如何远程访问kettle的图形界面呢 xff1f 我们通常有两种方式 xff1a 1 xff09 客
  • 电子罗盘的工作原理及校准

    ST集成传感器方案实现电子罗盘功能 电子 罗盘是一种重要的导航工具 xff0c 能实时提供移动物体的航向和姿态 随着半导体工艺的进步和手机 操作系统的发展 xff0c 集成了越来越多传感器 的智能手机 变得功能强大 xff0c 很多手机上都
  • OV2SLAM vs ORBSLAM2

    框图 各个模块算法 OV2SLAMORBSLAM2对比特征点提取与匹配Fast 43 LK光流Fast 43 ORB 描述子LK光流速度快输出的实时posePnPMotion only BAMotion only BA精度高一点初始化 单目
  • 论文学习--Learning High-Speed Flight in the Wild

    文章目录 Git子文链接代码运行编译环境编译步骤 可选 1 下载源码 2 先安装Open3D 3 修改Open3D的相关路径 4 开始编译 5 报错2 6 报错3 7 运行中报错 8 配置学习环境 9 下载flighemare渲染环境 运行
  • 仿真环境中生成专家轨迹

    仿真环境中生成专家轨迹 文章目录 仿真环境中生成专家轨迹简介代码运行步骤获取输入数据Reference TrajectoryEnvironment PointcloudFull Quadrotor State 方法描述输出规划轨迹 简介 本
  • 机器学习方法简介(1)--线性回归、逻辑回归、神经网络、支持向量机

    机器学习方法就是计算机根据已有的数据 xff0c 得出某个模型 xff0c 然后利用此模型预测未来的一种方法 机器学习的一个主要目的就是把人类思考归纳经验的过程转化为计算机通过对数据的处理计算得出模型的过程 1 回归算法 回归算法包括线性回
  • 仿真数据生成工具以及现有的仿真数据集

    现有仿真数据集 TartanAir TartanAir 是一个用AirSim生成的仿真SLAM数据集 xff0c 可以用于视觉SLAM 数据集提供 xff1a 双目 RGB 图像 xff0c 深度图像 xff0c 分割 xff0c 光流 x

随机推荐

  • 基于深度学习的SLAM概述

    目的 本博客总结最近看的几篇关于深度学习的SLAM以及基于深度学习的稠密重建 xff0c 简要对比记录特点 对比 年份名称类型框图前端输出地图方法特点回环2022DPVOmono VOVO每一帧的pose和paches转到3D坐标系下的3D
  • Airsim中运行OpenVINS和VINS_Fusion

    Airsim中运行OpenVINS和VINS Fusion 1 简介2 参考3 步骤3 1 编译3 2 运行3 3 运行结果3 4 相机和IMU参数配置 1 简介 本文简介在Airsim中运行OpenVINS和VINS Fusion 2 参
  • Apriltag生成

    Apriltag生成 一 单个Apriltag生成 生成单个的二维码 xff0c 下面给出30cmx30cm打印大小的生成脚本 xff0c 输入路径直接用 apriltag imgs 工程的tag36h11系列的图片即可 生成结果得到587
  • 论文学习---Learned Inertial Odometry for Autonomous Drone Racing

    总结 xff1a 文章主要介绍了仅用IMU作为输入的深度学习网络来估计相对位移 xff0c 估计的结果用于EKF更新 xff0c 可以得到较为准确的EKF估计状态 摘要 惯性里程计是敏捷无人机状态估计的一个具有吸引力的方案 单纯的使用IMU
  • 白话----之UCOS 信号量和邮箱

    总体理解 xff1a 两个任务需要共同访问一个共同的资源 xff0c 来切换或跳到不同的动作执行 这就产生信号量 两个任务 需要根据不同的按键选择 xff0c 来执行不同的动作 xff0c 产生邮箱 信号量和邮箱 我通过一个例子来学习的 希
  • 数据结构--结构体

    数据结构 https img blog csdn net 20181020104828701 watermark 2 text aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d4dWVjaGVuZw 61 61 font 5a
  • 小试牛刀爬北邮人论坛十大

    本来是为了写Alfred的work flow 不知道出了什么问题 一直都显示不了 sad 61 61 先把爬虫的代码贴这好了 好久没碰过python了 coding utf 8 author 61 39 wangxiao 39 import
  • mac安装homebrew报错 curl: (7) Failed to connect to raw.githubusercontent.com port443

    mac安装brew一直报错 xff0c 完整的报错信息如下 span class token literal property property curl span span class token operator span span c
  • C++ vector用法详解

    vector是STL的动态数组 xff0c 可以在运行中根据需要改变数组的大小 因为它以数组的形式储存 xff0c 所以它的内存空间是连续的 vector的头文件为 include lt vector gt 常用方法 xff1a span
  • 机器学习方法简介(2)--决策树、随机森林、朴素贝叶斯

    1 决策树 决策树是一种用于对实例进行分类的树形结构 Hunt算法 是一种采用局部最优策略的决策树构建算法 xff0c 它同时也是许多决策树算法的基础 xff0c 包括ID3 C4 5和CART等 Hunt算法的递归定义如下 xff1a 1
  • 软件工程——结构化分析方法

    结构化方法 概念 用来指导软件项目的开发 一种系统化的软件开发方法包括 xff1a 结构化分析方法 结构化设计方法 结构化程序设计方法 结构化设计方法和结构化程序设计方法的区别 xff0c 前者指的软件开发设计阶段的软件体系架构以及内部模块
  • linux安装软件方式--源码编译安装

    简介 xff1a 介绍源码编译安装软件包的管理 1 源码安装优点 xff1a 编译安装过程 xff0c 可以设定参数 xff0c 指定安装目录 xff0c 按照需求进行安装 xff0c 指定安装的版本 xff0c 灵活性比较大 2 源码安装
  • 正点原子mpu6050数据读取失败问题

    如果下载他们官方的程序都读不出来的话 看看你买的是stm32f407的V3版本吗 xff1f 这个版本是只有磁力计的官方代码 你用V3板跑他们的mpu的代码就会读不出来 xff0c 那个mpu6050的代码是已经停产的V2板子的
  • keil5 STM32F103 下载程序出错Flash Download failed - "Cortex-M3"

    1 背景 STM32F103单片机无法下载程序 最近在使用STM32单片机做项目 先是使用的H743单片机 xff0c 现在需要使用到F103单片机 H7烧写程序正常 xff0c 但是无法对F103烧写程序 错误为 xff1a Error
  • 略解总线带宽计算

    例1 xff1a 解 xff1a 时钟频率100MHz 也就是说一秒钟有100M个时钟周期 5个时钟周期传一个字 100M个时钟周期可以传100M 5 61 20M个字 也就是1秒钟可以传20M个字 一个字是16位 也就是2B 20M个字就
  • TX2(2): 安装JetPack L4T 3.1 (9003载板)

    参考官网教程 xff0c 其实官网教程已经挺详细 xff0c 主要看官网教程就行 http docs nvidia com jetpack l4t 3 1 index html developertools mobile jetpack l
  • String字符串编码格式转换(UTF8/GBK)

    1 转UTF8编码 string StdStringToUTF8 const string amp str int nwLen 61 MultiByteToWideChar CP ACP 0 str c str 1 NULL 0 wchar
  • 前缀树(Trie树)

    前缀树是一种用于快速检索的多叉树结构 xff0c 利用字符串的公共前缀来降低查询时间 xff0c 核心思想是空间换时间 xff0c 经常被搜索引擎用于文本词频统计 优点 xff1a 最大限度地减少无谓的字符串比较 xff0c 查询效率高 x
  • C++串口通信

    一 串口通信的基本原理 串口的本质功能是作为 CPU 和串行设备间的编码转换器 当数据从 CPU 经过串行端口发送出去时 xff0c 字节数据转换为串行的位 xff08 bit xff09 xff1b 在接收数据时 xff0c 串行的位被转
  • 死锁的四个必要条件以及处理策略

    一 什么是死锁 死锁是指两个或两个以上的进程 xff08 线程 xff09 在运行过程中因争夺资源而造成的一种僵局 例如 xff0c 某计算机系统中只有一台打印机和一台输入设备 xff0c 进程P1正占用输入设备 xff0c 同时又提出使用