死锁问题概述

文章目录

  • 死锁的概念
    • 死锁的定义
    • 相似概念:饥饿
    • 死锁产生的原因
    • 死锁产生的必要条件
    • 死锁的预防
      • 破坏互斥条件
      • 破坏不可剥夺/不可抢占条件
      • 破坏请求并保持条件
      • 破坏循环等待条件
    • 死锁避免
      • 安全性算法
    • 死锁的处理策略
      • 死锁的检测
      • 死锁的解除

死锁的概念

在这里插入图片描述

死锁的定义

多个进程由于竞争资源而造成的阻塞现象,若无外力作用,这些进程都将无法继续推进

相似概念:饥饿

等待时间过长以至于给进程推进和相应带来明显影响,“饿而不死”。

死锁产生的原因

  • 系统资源的竞争;
  • 进程推进的顺序非法;

死锁产生的必要条件

  • 互斥条件:共享资源的排他性(独占性)访问;
  • 不可剥夺条件:访问时该共享资源不会被剥夺;
  • 请求保持条件:保持当前资源时请求另一个资源;
  • 循环等待条件:存在共享资源的循环等待链;

死锁的预防

死锁的预防毫无疑问要从死锁产生的原因作为入手点。我们已经知道了死锁产生的四个必要条件,那么要解决死锁问题,就要从如何破坏死锁产生的四个条件展开。

破坏互斥条件

  • 将只能互斥访问的资源改为同时共享访问;
  • 将独占锁修改为共享锁;
  • 不是所有的资源都可以改成共享的
    在这里插入图片描述

破坏不可剥夺/不可抢占条件

  • 请求新资源无法满足时必须释放已有资源;
  • 由OS协助强制剥夺某进程持有的资源;
  • 实现复杂,代价高;
  • 此操作过多导致原进程任务可能无法推进

在这里插入图片描述

破坏请求并保持条件

  • 进程开始运行时一次性申请所有需要的资源;
  • 阶段性请求和释放资源;
    在这里插入图片描述

破坏循环等待条件

  • 对所有资源进行排序,按序号请求资源;
  • 对资源的编号应该尽可能稳定,这限制了新设备的增加
  • **进程使用资源的顺序可能与系统编号顺序不同;
  • 限制了用户编程

死锁避免

个人觉得死锁的预防与死锁的避免有些类似。死锁的预防是针对死锁产生的条件进行分析,死锁的避免更偏向于操作系统通过一系列策略来对进程管理和各个进程所需的资源进行分配,以求达到死锁避免的效果。

安全性算法

  • 系统安全状态
    • 安全状态一定不会出现死锁;
    • 不安全状态可能会出现死锁;
  • 银行家算法
    • 系统预判进程请求是否导致不安全状态;
    • 是则拒绝请求,否则答应请求;
      在这里插入图片描述
      银行家算法举例:如上图所示
  • 表格中展示了当前状态各个进程占用资源情况以及所需资源情况;
  • 假如先执行P0,则还需分配5个资源,但此时可用资源为3,不行;
  • 假如先执行P1,当前已分配2,还需分配2,小于可用资源,可行;
    • 假如再执行P0,当前P1释放了4个资源,可用资源为5,等于P0所需,可行;
      - 最后执行P2,可行;
    • 假如再执行P2,当前可用资源为5,小于P2所需资源,不可行;
  • 假如先执行P2,还需分配7个资源,大于可用资源,不可行;

死锁的处理策略

死锁的检测

  • 需要一种数据结构,保存有关资源的请求和分配信息;
  • 提供一种算法,利用这些信息检测是否形成了死锁;

可以使用图这种数据结构来保存资源的请求和分配信息。

如示意图所示:定义资源分配图(G=(N, E)),其中有两种资源、两种节点。图的边分为两种类型:分配边以及请求边。可以看到,图中有两种资源,分别是R1和R2;两个进程P0和P1。注意:图中的一条边代表一个资源的请求/分配。
在这里插入图片描述死锁定理(死锁状态的充分条件):

  • 当且仅当此状态下资源分配图是不可完全简化的;
  • 简化过程类似于“拓扑排序”算法;

在了解死锁定理的概念后,我们继续分析上图,来对其进行简化。怎么简化呢?

首先去除孤点和不阻塞的点,上图中P0分配了2个R1资源,正在请求1个R2资源(R2目前分配了1个给P1,还剩一个可分配),因此P0请求成功,不阻塞。接下来上图简化结果如下:
在这里插入图片描述
接下来,由于P0释放了占用的资源,阻塞状态的P1得以继续执行(不阻塞了),因此P1也可继续去除。结果如下图:
在这里插入图片描述
可以看到,此时资源与节点都是孤立的,这种状态就是所谓的完全简化。也意味着不会发生死锁。

死锁的解除

  • 资源剥夺
    • 挂起死锁进程
    • 剥夺其资源
    • 将资源分配给其他进程
  • 撤销进程
  • 进程回退
    • 回退到足以避免死锁的地步
    • 需要记录进程历史信息,设置还原点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/124482.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用超融合,网络交换机如何选型与配置?

很多用户在部署超融合集群时,都会关注网络交换机的选型与配置。我们在这篇文章中整理了一些关于网络交换机的常见提问,并邀请 SmartX 技术专家进行了详细解答。 Q1. 超融合架构下,网络交换机是如何部署的?需要多少台交换机&#x…

火爆全网!用 Pyecharts 就能做出来“迁徙图“和“轮播图“

1.pyecharts知识点回顾 1)知识回顾 前面我们已经讲述了,如何使用pyecharts进行图形的绘制,一共涉及到如下四步。我们今天就是按照下面这几步来进行迁徙图和轮播图的绘制。 ① 选择图表类型; ② 声明图形类并添加数据&#xff1…

Linux-Shell命令行解释器的模拟实现

引言:本篇文章主要是简单实现一个shell命令行解释器,可以支持基础常见的linux的命令,支持内建命名echo、cd,同时支持重定向的操作! 一、代码剖析 1. 头文件引入: 因代码是在linux下实现,引入的…

全国5米高程DEM数据及衍生的全国地形起伏度数据

地表起伏度,也有称为地势起伏度、地形起伏度,是指某点在其确定面积的域内的最高点与最低点之间的高差。地表起伏度概念的核心在于如何确定该点的计算域。在统计意义上,随着计算域范围的增大,地表起伏度将逐渐增大。 因此&#xff…

GitHub上的开源工业软件

github上看到一个中国人做的流体力学开源介绍,太牛了! https://github.com/clatterrr/FluidSimulationTutorialsUnity 先分析一下工业仿真软件赛道 工业仿真软件的赛道和产品主要功能如下: 1. 工艺仿真赛道: - 工厂布局优化&am…

linux 下 mysql8 修改root初始密码

背景 linux下安装完mysql8以后,无法使用root用户登录或者忘记了root用户的密码,需要修改root用户的密码; 步骤 不想翻译了,专业人员都能看懂。完结 链接 MySQL :: MySQL 8.0 Reference Manual :: B.3.3.2 How to Reset the Roo…

MATLAB|不给糖果就捣蛋

目录 扫一扫关注公众号 效果图 代码 绘制南瓜 绘制无脸男小鬼 其中绘制风车代码: 其中 EllipsePlotter类函数代码如下 属性 (properties) 方法 (methods) 扫一扫关注公众号 效果图 代码 绘制南瓜 clc;clear;close all; [X,Y,Z]sphere(200); R1(-(1-mod(0:…

centos 7.9系统安装老版本jenkins,并解决插件问题

1.初衷 因为jenkins随着时间推移,其版本也越来越新,支持它运行的JDK也越来越新。基于不折腾的目标,我们安装一个老的固定版本就行。以前安装新版本,经常碰到的问题就是插件安装不兼容的问题。现在这个问题,可以把以前…

MySQL的默认引擎为什么是InnoDB

MySQL支持InnoDB、MyISAM、MEMORY、CSV等多个存储引擎,那为什么选InnoDB作为默认引擎呢? 主要原因有几点: 事务 事务主要用于保持数据一致性,是一组操作的集合,要么全部成功,要么全部失败。InnoDB引擎提供…

Kubernetes平台部署Grafana Loki Promtail系统

部署结构图: Loki 是主服务,负责存储日志和处理查询promtail 是代理,负责收集日志并将其发送给 lokiGrafana 用于 UI 展示 只要在应用程序服务器上安装promtail来收集日志然后发送给Loki存储,就可以在Grafana UI界面通过添加Lok…

通过docker快速部署RabbitMq

查询镜像: docker search rabbitmq拉去RabbitMq镜像: docker pull rabbitmq:management创建数据卷: docker volume create rabbitmq-home运行容器: docker run -id --namerabbitmq -v rabbitmq-home:/var/lib/rabbitmq -p 156…

解决docker tag打标签时报错:Error response from daemon: no such id

现象: 原因: docker tag时不仅仅要Repository仓库名,也需要原有的tag作为版本号 解决办法: docker tag 原有仓库名: 原有tag值 新的打标名称 问题解决!

【LeetCode百道热题】1.两数之和

一,题目描述 给定一个整数数组nums和一个整数目标值target,请你在改数组中找出和为目标值target的那两个整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案,但是,数组中同一个元素在答案里不能重复出现…

陈海波:OpenHarmony技术领先,产学研深度协同,生态蓬勃发展

11月4日,以“技术筑生态,智联赢未来”为主题的第二届OpenHarmony技术大会在北京隆重举办。本次大会由OpenAtom OpenHarmony(简称“OpenHarmony")项目群技术指导委员会(TSC)主办,由华为技术…

【STM32-DSP库的使用】基于Keil5 + STM32CubeMX 手动添加、库添加方式

STM32-DSP库的使用 一.CMSIS-DSP1.1 DSP库简介1.2 支持的函数类别1.3 宏定义 二、操作2.1 STM32CubeMX 配置基本工程2.2 Lib库的方式实现(推荐)2.3 手动添加DSP文件(可以下载官方最新库,功能齐全) 三、MFCC测试DSP加速效果 为验证语音识别MFC…

搭建 Makefile+OpenOCD+CMSIS-DAP+Vscode arm-none-eabi-gcc 工程模板

STM32F407-GCC-Template Arm-none-eabi-gcc MakefileOpenOCDCMSIS-DAPVscode工程模板 一、本次环境搭建所用的软硬件 1)Windows or Linux (本文以Windows为主) 2)JLink、Daplink、Wch-Link烧录器 3)GNU Arm Embedded Toolchain交叉编译…

C++模板元模板实战书籍讲解第一章题目讲解

目录 第一题 C代码示例 第二题 C代码示例 第三题 3.1 使用std::integral_constant模板类 3.2 使用std::conditional结合std::is_same判断 总结 第四题 C代码示例 第五题 C代码示例 第六题 C代码示例 第七题 C代码示例 总结 第一题 对于元函数来说,…

贺天下功夫酱酒闪耀亮相2023佛山秋色系列活动

11月1日至5日,2023年广东非遗周暨佛山秋色巡游系列活动在佛山举行,以“品味佛山 秋醉岭南”为主题,好戏连台。贵州贺天下酒业独家赞助佛山祖庙秋祭、乡饮酒礼,还全面参与佛山秋色巡游、佛山非遗美食展、佛山非遗音乐会等多个活动&…

centos k8s安装dapr

文章目录 安装helm更新helm库初始化dapr高可用方式安装 卸载dapr验证k8s的dapr安装rocketmq总结 安装helm 三个包放到一个目录下 chmod x get ./get helm version更新helm库 helm repo add dapr https://dapr.github.io/helm-charts/ helm repo update helm search repo dapr …

2023年腾讯云双11活动入口在哪里?

2023年双11腾讯云推出了11.11大促优惠活动,下面给大家分享腾讯云双11活动入口、活动时间、活动详情,希望可以助力大家轻松上云! 一、腾讯云双11活动入口 活动地址:点此直达 二、腾讯云双11活动时间 腾讯云双11活动时间跨度很长…