什么是死锁?死锁的产生条件及解决办法

2023-05-16

定义:在两个或多个并发进程中,如果每个进程持有某种资源而又都等待着别的进程释放它或它们现在保持着的资源,否则就不能向前推进,此时每个进程都占用了一定的资源但又都不能向前推进,称这一组进程产生了死锁。

产生原因:1、系统资源不足;2、进程推进顺序非法。

产生死锁的四个必要条件

互斥条件:涉及的资源是非共享的。

不剥夺条件:进程所获得的资源在未使用完毕之前不能被其它进程强行夺走。

部分分配:进程每次申请它所需要的一部分资源,在等待新资源的同时继续占用已分配到的资源。

环路条件:存在着一种进程的循环链,链中的每一个进程已获得的资源同时被链中的下一个进程请求。

死锁的解决方法:

简单描述(四种方法):

        预防:通过设置某些限制条件,以破坏产生死锁的四个条件中的一个或者几个,来防止发生死锁。

        避免:系统在分配资源时根据资源的使用情况提前作出预测,从而避免死锁的发生。

        检测:允许系统在运行的过程中产生死锁,但是,系统中有相应的管理模块可以及时检测出已经产生的死锁,并且精确地确定与死锁有关的进程和资源,然后采取适当措施,清除系统中已经产生的死锁。

        解除:与检测死锁相配套的一种措施,用于将进程从死锁状态下解脱出来。

具体描述(三种方法):

        预防:根据生产死锁的四个必要条件,只要使用其中之一不能成立,死锁就不会出现。但必要条件①是由设备的固有特性所决定的,不仅不能改变,相反还应加以保证,因此实际上只有三种方法。

        预防死锁是一种较易实现的方法,已被广泛使用,但由于所施加的相知条件往往太严格,可能导致系统资源利用率和系统吞吐量降低。即具体可通过以下3种方法实现:

        1、防止部分分配(摒弃请求和保持条件)

        系统要求任一进程必须预先申请它所需要的全部资源,而且仅当该进程的全部资源要求能得到满足时,系统才能给予一次性分配,然后启动该进程运行,但是在分配时只要有一种资源不满足,系统就不会给进程分配资源。进程运行期间,不会再请求新的资源,所以,再分配就不会发生(摒弃了部分分配)。其特点为:资源严重浪费,进程延迟进行。

        2、防止“不剥夺”条件的出现

        采用的策略:一个已经保持了某些资源的进程,当它再提出新的资源要求而不能立即得到满足时,必须释放它已经保持的所有资源,待以后需要时再重新申请。此方法实现比较复杂,且要付出很大代价;此外,还因为反复地申请和释放资源,而使进程的执行无限地推迟,延长了周转时间,增加了系统的开销,降低了系统吞吐量。(例如打印机打印的结果不连续)

        3、防止“环路等待”条件的出现

        采用资源顺序使用法,基本思想是:把系统中所有资源类型线性排队,并按递增规则赋予每类资源以唯一的编号,例如输入机=1,打印机=2,磁带机=3,硬盘=4等等。进程申请资源时,必须严格按资源编号的递增顺序进行,否则系统不予分配。

        优点:资源利用率和系统吞吐量与另两种方法相比有较明显的改善。

        缺点:1、为系统中各种类型的资源所分配的序号必须相对稳定,这就限制了新设备类型的增加。2、作业实际使用资源的顺序与系统规定的顺序不同而造成资源的浪费。

        避免:避免死锁与预防死锁的区别在于:预防死锁是设法至少破坏产生死锁的必要条件之一,严格地防止死锁的出现。

        避免死锁,它是在进程请求分配资源时,采用某种算法(银行家算法)来预防可能发生的死锁,从而拒绝可能引起死锁的某个资源请求。

        在避免死锁(或银行家算法)中必须谈到两种系统状态:①安全状态,指系统能按照某种顺序,为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。②非安全状态:即在某个时刻系统中不存在一个安全序列,则称系统处于不安全状态或非安全状态。

        虽然并非所有不安全状态都是死锁状态,但当系统进入不安全状态后,便有可能进入死锁状态;反之只要系统处于安全状态,系统便可避免进入死锁状态。因此,避免死锁的实质是如何使系统不进入不安全状态。

        检测和恢复:死锁的检测和恢复技术是指定期启动一个软件检测系统的状态。若发现有死锁存在,则采取措施恢复之。

        死锁的检测:检查死锁的办法就是由软件检查系统中由进程和资源构成的有向图是否构成一个或多个环路,若是,则存在死锁,否则不存在。其实质是确定是否存在环路等待现象,一但发现这种环路便认定死锁存在,并识别出该环路涉及的有关进程,以供系统采取适当的措施来解除死锁。

        死锁的解除:1、将陷入死锁的进程全部撤销。2、逐个作废死锁进程,直至死锁不再存在。3、从死锁进程中逐个地强迫抢占其所占资源,直至死锁不存在。

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

什么是死锁?死锁的产生条件及解决办法 的相关文章

  • 字符串结束符'\0' -何时自动加- 字符串定义方法

    转载 字符串定义方法 有两种方法 1 用字符数组 xff1b 2 用字符指针 xff1b 对应两种定义方法 xff0c 有不同的初始化以及赋值方法 对字符数组 xff0c 有以下几种定义方法 xff1a 1 char str 61 34 1
  • 基于Airsim的sitl模拟环境配置(ubuntu 16.04)

    基于Airsim的sitl模拟环境配置 xff08 ubuntu 16 04 xff09 sitl仿真 xff0c 软件在环仿真可以不使用任何硬件就可以进行模拟飞行或驾驶 xff0c 实验室获取数据非常有用 基于Airsim的sitl模拟需
  • F450机架组装及飞控安装细节

    http tieba baidu com p 5342947735
  • 富斯i6接收机及PPM编码器​​​​​​​接线

    没有完成发射机和接收机对码 xff0c 则需要按照如下过程对码 xff1a 1 将对码线连接到接收机上的 B VCC 接口 2 将电源线连接到接收机上任意其他接口 3 打开发射机电源 xff0c 同时常按发射机 BINDKEY 键 xff0
  • Pixhawk指示灯和安全开关含义

    Pixhawk指示灯的含义 红灯和蓝灯闪 xff1a 初始化中 请稍等 黄灯双闪 xff1a 错误 系统拒绝解锁 蓝灯闪 xff1a 已加锁 xff0c GPS搜星中 自动导航 xff0c 悬停 xff0c 还有返回出发点模式需要GPS锁定
  • MP地面站提示

    PIX飞控或者APM飞控在装机后 xff0c 经常遇到不能解锁的情况 xff0c 地面站会有提示 xff0c 下面列出了可能出现的情况 xff0c 可以一一对应的排除故障 当然 xff0c 你也可以在地面站设置解锁不自检 xff0c 不过安
  • win7下 pixhawk (ardupilot) 的编译

    前几天都在搞pixhawk源码编译问题 xff0c 什么在window下用Console或者eclipse xff0c 还是在Ubuntu下 xff0c 都做了 xff0c 而且把 mk文件都看了 xff0c 结果还是有bug 总结一下三种
  • pixhawk 基于UART5 的NSH环境搭建

    元器件 xff1a pixhawk 六针杜邦线 USB转uart模块 PC机上的串口调试软件 xff08 比如 Putty xff09 STEP 1 xff1a 制作调试通信线 xff08 六针杜邦线和USB转uart模块 xff09 xf
  • 操作系统 | 用户态和内核态的切换(中断、系统调用与过程(库函数)调用)

    文章目录 中断过程调用系统调用过程调用和系统调用的区别 中断 用户态 内核态之间的切换是怎么实现的 用户态 内核态 是通过中断实现的 并且 中断是唯一途径 核心态 用户态 的切换是通过执行一个特权指令 xff0c 将程序状态字 PSW 的标
  • MFC鼠标响应、鼠标画线

    鼠标响应关键就是对两个函数进行操作 xff1a OnLButtonDown和OnLButtonUp xff1b 1 使用MFC AppWizard exe xff09 建立一个单文档MFC工程 2 首先要在CxxxView类的定义里加上后续
  • stm32cubeide的freertos-消息队列发送结构体或者长消息,接收不完整的问题

    今天在项目创建消息队列 xff0c 消息队列中的数据类型的是结构体 xff0c 调用接口使用的cubeide自带的创建消息队列的接口 span class token keyword typedef span span class toke
  • cmake添加动态链接库

    如果使用gcc进行单个c文件编译的时候 xff0c 有时候后面会需要添加如 L l之类的参数 xff0c 如下 gcc o test test c L usr local lib lopencv 这里 L是制定动态库的位置 xff0c l则
  • Error installing 'file:///xxxx': editable mode is not supported for pyproject.toml-style project

    Please install using pip install no use pep517 e or upgrade pip to the latest version https stackoverflow com questions
  • MSCKF演示实验

    在工作空间目录进行编译 catkin make span class token operator span pkg msckf vio span class token operator span cmake span class tok
  • Linux下抓取串口log

    1 准备 串口线一条 手机一个 2 步骤 1将串口线插入电脑USB口 xff0c 开启另一个终端查看串口设备名 xff0c 输入下面命令 xff1a dmesg 2找到最下面一行 xff0c 尾部即是串口设备名称 xff0c 我这里叫做 t

随机推荐