Linux——死锁概念介绍和解决方式

news2024/9/20 8:11:14

目录

一.死锁概念介绍

二.死锁的解决方式

(一).预防死锁

方式一:不请求

方式二:强制剥夺资源

方式三:线性分配资源

(二).避免死锁:银行家算法

总体流程

安全性检查(安全性算法)


一.死锁概念介绍

死锁指的是在多线程环境中,每个执行流(线程)都有未释放的资源,且互相请求对方未释放资源,从而导致陷入永久等待状态的情况。

就好比和绑匪交赎金时,家属要求先放人再给钱,绑匪要求先交钱再给人,双方达不成一致意见,导致出现“僵死”的局面。

程序层面而言,两个线程各加一个互斥锁mutex,在临界区中试图获取对方的互斥锁,陷入“互相请求对方的锁,但不释放自己锁”的尴尬局面,这就是死锁的一种场景。

图示如下:

达成死锁需要四个必要条件:

①线程互斥。同一时间只能有一个执行流拥有资源

②请求与保持。执行流请求资源时,不能释放已有资源

③不剥夺。执行流已有资源不能被强制剥夺

④循环等待。多个执行流之间形成一种循环等待资源的局面

二.死锁的解决方式

(一).预防死锁

方式一:不请求

剥夺执行流在执行时获取资源的权力,也就是说,执行流在未执行前就获取全部需要的资源,如果有资源未能获取,就先阻塞等待。

缺点:资源利用率低,有锁的情况下其实就是串行执行。

方式二:强制剥夺资源

执行流一旦因为申请资源阻塞,立马释放自己已有的全部资源。

缺点:如果执行流因为释放已有资源导致再次获取时阻塞,从而再次释放,再次申请。假如这样循环多次,肯定会造成资源浪费和性能下降。

方式三:线性分配资源

也就是避免出现循环请求资源。

将所有同类资源按照线性排序。当执行流申请该类型资源时,必须一次性按照线性顺序申请完毕。释放同理。这样就能避免出现循环申请的情况。

图示如下:

(二).避免死锁:银行家算法

总体流程

银行家算法可用于避免死锁的产生,起初是应用在银行内部,确定借贷人是否有能力还贷。当借贷人向银行提出申请时,会根据借贷人项目的最大资金数和本银行现有资产数量确定是否借贷。

在银行家算法里,我们需要四个基本数据结构:

①available向量一维数组,用于确定系统中可利用资源的数量。比如:available[m] = k代表m类资源在系统中有k个可用资源。

②max矩阵二维数组,用于确定每个线程所需的各类资源的总数量(最大数量)。比如:max[i][j] = k代表线程i总共需要k个j类资源。

③allocation矩阵二维数组,代表每个线程已经分配的各类资源数量。比如:allocation[i][j] = k代表已经给线程i分配了k个j类资源。

④need矩阵二维数组,代表每个线程还需要的各类资源数量。比如:need[i][j] = k代表线程i还需要k个j类资源。

需求关系:need[i][j] = max[i][j] - allocation[i][j]

银行家算法具体步骤如下:
设申请的资源量为request[j],首先与need[i][j]相比,<=need[i][j]就进入下一步,否则出错,因为申请的资源量大于所需值。

第二步中,将request[j]与available[j]相比,<=available[j]就进入下一步,否则阻塞,因为当前所需资源的数量不足,需要阻塞等待资源到位。

第三步中,系统将“尝试(假装)”分配相关资源给该线程,并将以下数据修改
available[j] = available[j] - request[j]

allocation[i][j] = allocation[i][j] + request[j]

need[i][j] = need[i][j] - request[j]

第四步中,进行安全性检查。检查系统当前是否在安全状态,如果在安全状态,就 正式分配资源,否则表示系统不安全,让线程等待。

图示如下:

安全性检查(安全性算法)

在安全性检查中,需要两个数据结构:

①work向量一维数组,用于确定此时系统可以提供的各类资源的数量。

②finish向量一维数组(bool类型),如果finish[i] == true,表示i线程有足够的资源能够完成运行,否则说明不能运行完成(即该线程此时不安全)。

具体流程如下:

第一步:从所有线程中找到一个满足need[i][j] < work[j] && finish[j] == false的。即可以提供的资源量能够满足某线程需求,且该线程尚未运行完成。如果有就进入第二步,否则进入第三步。

第二步:该线程获得资源后能够顺利执行完成,且可以释放已有资源,因此,将以下数据修改并返回第一步继续检索线程

work[j] += allocation[j]

finish[j] = true

PS:安全性检查只是一种检查,因此这些数组数据修改都是在模拟资源的申请与释放过程,并不是真正在配分资源。

第三步:此时,已经没有线程满足第一步要求,遍历finish数组,如果有false说明不安全,否则安全

图示如下:

总结一下,在小编看来,安全性检查本质上是判断当前系统中是否有线程已经等待资源配置。虽然线程能够走到安全性检查说明已经有足够的资源供其分配,但是如果检查为不安全代表此时其他线程中有资源需求大于供给的情况并且已经阻塞, 那么当前线程不应该再继续分配资源而是阻塞等待。

对象是过程的抽象,线程是调度的抽象——James O Coplien


如有错误,敬请斧正 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言---冒泡排序和快速排序

文章目录前言一、冒泡排序1.简介2.算法思路3.代码实现二、快速排序1.简介2.算法思路2.1左右指针法2.2挖坑法2.3前后指针法总结前言 交换排序有冒泡排序和快速排序这两种&#xff0c; 基本思想&#xff1a;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两…

多目标跟踪:文献综述

文章目录摘要1、简介1.1、与其他相关综述的区别1.2、贡献1.3、综述的结构1.4. 外延2、 MOT问题2.1、问题公式化2.2、MOT的分类2.2.1、初始化方法2.2.2、处理方式2.2.3、输出类型2.2.4. 讨论3、MOT的组成3.1、外观模型3.1.1、视觉表征3.1.2. 统计测量3.2、运动模型3.2.1. 线性运…

安装httprunner manager遇到的坑

安装httprunner manager参考博客&#xff1a;https://www.cnblogs.com/MrqiuS/p/12944481.html安装mysqlclient报错Collecting mysqlclient1.3.12Downloading https://mirrors.aliyun.com/pypi/packages/6f/86/bad31f1c1bb0cc99e88ca2adb7cb5c71f7a6540c1bb001480513de76a931/m…

maven利用springboot的配置文件进行多个环境的打包

在Spring Boot中多环境配置文件名需要满足application-{profiles.active}.properties的格式&#xff0c;其中{profiles.active}对应你的环境标识&#xff0c;可以随意命名&#xff0c;但要与pom文件中环境标识一样。至于哪个具体的配置文件会被加载&#xff0c;需要在applicati…

Docker系列 01

前言 学完这篇文章&#xff0c;你会知道Docker是什么&#xff1f;解决了什么问题以及如何安装Docker。在后续的系列文章中&#xff0c;我们会陆续介绍Docker的常用命令、镜像原理、Dockerfile以及网络管理等&#xff0c;让你对Docker有较为系统的认知&#xff0c;持续关注吧。 …

多继承的运用

//在封装一个领导类&#xff08;Leader&#xff09;:包括受保护成员&#xff1a;岗位、工资&#xff0c;完成其相关函数及show//由以上两个类共同把派生出学生干部类&#xff1a;引入私有成员&#xff1a;管辖人数&#xff0c;完成其相关函数以及show函数//在主程序中&#xff…

一刷代码随想录——动态规划

1.理论基础如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c;贪心没有状态推导&#xff0c;而是从局部直接选最优的。对于动态规划问题&#xff0c;我将拆解…

24考研——高等数学的基础概念定理(一)——第一章|函数、极限、连续

今天考试&#xff0c;考定理&#xff0c;我是真没想到这些定理&#xff0c;脑袋瓜子嗡嗡的&#xff0c;害&#xff0c;废话少说&#xff0c;直接开干 文章目录一、基础概念定理1.1 收敛数列的性质&#xff08;唯一性、有界性、保号性、数列与子列关系&#xff09;1.2 函数极限的…

一款语文老师写的word办公神级插件

没错&#xff0c;正如题所说&#xff0c;这是一款语文老师开发的word办公神级插件----不坑盒子&#xff0c;小编体验了一下还真是太强大了&#xff01;双击exe文件&#xff0c;选择任意安装目录即可开始安装如果你的电脑缺少运行库&#xff0c;软件会自动帮你下载安装好安装完成…

QT模块化编程 pro pri 子工程 使用

如果工程过大时&#xff0c;就需要分子模块&#xff0c;Qt 也给我们提供了一种方式 Pri&#xff1b; 这里我们来看看Pri在项目中的使用&#xff0c;项目使用实际上也是很有主要可以模块清晰化&#xff0c;能提高程序的可扩展性。 网上这种写的很多&#xff0c;但少有写明白的&…

EGFR靶点药物研发进展-销售数据-上市药品前景分析

根据世界卫生组织的最新报告&#xff0c;与世界上其他癌症相比&#xff0c;肺癌导致的死亡率最高。非小细胞肺癌 (NSCLC) 约占肺癌病例总数的 85%。大量的风险因素归因于肺癌的发展&#xff0c;表皮生长因子受体 (EGFR) 是最常见的突变驱动基因之一&#xff0c;通过调节 PI3K/A…

Sentinel之授权规则与规则持久化

一、上集回顾上级文章地址&#xff1a;【SpringCloud】Sentinel 之隔离与降级_面向架构编程的博客-CSDN博客我们先来回顾一下Sentinel控制台上面的功能&#xff1a;所以&#xff0c;本章节就来研究 "授权规则"这一功能模块。二、授权规则授权规则可以对请求方来源做判…

XV6实验(2020)

XV6实验记录(2020) 环境搭建 参考连接 Lab guidance (mit.edu) 6.S081 / Fall 2020 (mit.edu) xv6 book中文版 Lab1:Xv6 and Unix utilities 实现几个unix实用工具&#xff0c;熟悉xv6的开发环境以及系统调用 Boot xv6 就是准备环境&#xff0c;克隆仓库&#xff0c;编…

代码随想录算法训练营第五十三天|● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

一、1143.最长公共子序列 题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不…

Android 自定义控件

文章目录Canvas 画布类 画布背景 点 线 矩形 椭圆 圆 弧形 路径 字符 对画布裁剪及变形Paint 画笔类 常用方法 图形线条相关 字符相关 Path设置样式如果是一个自定义控件&#xff0c;则需要派生自 Vie…

【Vue】模板语法——内置指令

指令&#xff08;Directives&#xff09;是 vue 为开发者提供的模板语法&#xff0c;用于辅助开发者渲染页面的基本结构。vue 中的指令按照不同的用途可以分为如下几大类&#xff1a;① 内容渲染指令&#xff1a;v-text、v-html② 属性绑定指令&#xff1a;v-bind③ 事件绑定指…

<Java EE 进阶> 3.Spring简单的读和取

目录 1.存储Bean对象 &#xff08;1&#xff09;准备工作&#xff1a;配置扫描路径 &#xff08;2&#xff09;添加注解存储Bean对象 ① 类注解 ② 方法注解Bean 在String中更简单的存储和读取对象的核心是使用注解 1.存储Bean对象 &#xff08;1&#xff09;准备工作&am…

Linux内核的安装与加载

目录 一、tftp加载Linux内核和roootfs 二、 EMMC加载Linux内核和rootfs 三、tftp加载Linux内核nfs挂在根文件系统 四、EMMC加载uboot 一、tftp加载Linux内核和roootfs 这个就是Linux内核&#xff0c;它很轻量级只有2.949MB所以在嵌入式领域很受欢迎。 上面那个就是设备树文…

初识 Python 科学计算库之 NumPy(创建多维数组对象)

文章目录参考描述NumPy特点获取导入多维数组对象np.array()np.asarray()范围随机概览np.random.randn()np.random.normal()np.random.choice()np.random.random()np.random.randint()np.random.shuffle()np.random.seed()数列等差数列等比数列填充np.zeros()np.zeros_like()np.…

Spotify Q4用户增长再超预期,但为何还是赚不到钱?

2022年&#xff0c;美联储接连7次暴力加息&#xff0c;科技行业整体低迷&#xff0c;从Meta、Google再到亚马逊&#xff0c;大型科技公司接连宣告裁员过冬。 寒气已经传递到了更广阔的地方。1月下旬&#xff0c;瑞典音乐流媒体巨头Spotify宣布将裁员6%。 音乐流媒体的生意变得…