死锁的成因和解决方案

news2024/9/30 21:33:54

死锁🔒的成因和解决方案📑

锁是操作系统和程序语言中常用的同步机制,用于保证共享资源的互斥访问,防止多个线程或进程同时访问共享资源,导致数据不一致或程序崩溃。

死锁是我们在进行并发编程中需要时刻避免的一个问题。当多个线程互相等待的时候对方释放资源,系统就会出现死锁。具体来说,当一个线程获得一把锁,但同时它需要获取另外一把锁才能够继续往下执行,而另外一把锁又被其他线程占用了,这时候就会产生死锁。

在这里插入图片描述

形成死锁的四个必要条件:

  1. 互斥使用

​ 当一个线程拿到一把锁之后,另一个线程会一直陷入等待状态,无法正常执行程序。(锁的基本特点)

  1. 不可抢占

    一个线程拿到锁,只能由自己自动释放,不能被其他线程进行抢夺。(不能进行强行夺取)

  2. 请求和保持

    在占用一把锁后,还对其他线程中的锁进行请求,而且还一直保持着占用锁的使用。

  3. 循环等待

    一个锁被占有,需要另一把锁进行解锁,悲观另一把锁已经被其他锁占有了,陷入了永远等待。

要满足4个条件才会形成死锁,在进行编程时,需要格外注意不能形成死锁。而避免死锁只需要去除其中一个条件就可以解开死锁。

解决死锁

  1. 破环循环等待条件

    1. 为锁进行编号,约定获取锁的顺序,从大到小或者从小到大。

在学习锁时,不可避免就会出现一个“吃拉面问题”。已知哲学家吃面是一个死锁问题。

只有拿到两根筷子才可以吃面,当只有五根筷子五个哲学家,一人一根筷子,而且只等待别人吃完面放下筷子时,自己才可以吃到面。这样的吃面方法就会导致死锁!

在这里插入图片描述

使用为锁(筷子)进行编号进行解开死锁。

在这里插入图片描述

约定:获取筷子只能从小到大编号进行获取

  1. A哲学家获取了1号筷子就会制约E哲学家获取筷子。相当于E哲学家没有筷子。
  2. 那么D玩家就可以拿到3号筷子和5号筷子成功吃到拉面。也就是避开死锁。

2. 预防死锁

在进行并发编程时,要避免使用多个锁,如果实在无法避免使用多个锁那就采用相同的获取锁顺序避免最简单的死锁情况。就意味着当一个线程在加锁时要使用相对约定好的顺序来获取锁,以此来避免死锁。

3. 避免死锁

在采用多个锁的情况下,采用预防算法来避免死锁,使得死锁无法成功,例如:“银行家算法”,这个算法就是利用预判的思想来观察下一步的操作会不会使得这个线程变成死锁状态,如果会死锁,则立马会停止操作,起到避免死锁的作用。

4. 检测死锁

在程序之中,可以编写代码来检测代码中是否存在死锁,并及时终止这些无法恢复的死锁进程,不过这个有一个缺陷,你不能一直循环找死锁,会浪费太多CPU资源,而是设置一个时间去检查程序中的死锁状态,所以有时候在程序中出现死锁时,无法及时终止死锁进程会浪费时间。

5. 解除死锁

当发生死锁时,尝试解除一部分资源,或采用抢占资源的方式强行中断一个进程以解除死锁,这个是解除了死锁条件中非抢占式来解除死锁的方式。

解除死锁,是一件非常复杂的事,需要综合考虑程序的性能效率和安全性,然后选择合适的方案,尽量挑选减少死锁发生和解除死锁高效的方法。

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

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

相关文章

路径规划算法:基于引力搜索优化的路径规划算法- 附代码

路径规划算法:基于引力搜索优化的路径规划算法- 附代码 文章目录 路径规划算法:基于引力搜索优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

iPhone遇到错误53该如何快速修复?

在所有手机中,iphone是出现问题较少的一款手机,但有时候用户会偶尔遇到一些系统问题。例如,错误53是许多用户常见反馈问题之一。如果你还得到错误53 今天小编的就分享如果iphone遇到系统错误53的解决办法。 当我们尝试通过iTunes工具来恢复或…

TDengine 时序数据的保留策略

“TDengine除vnode分片之外,还对时序数据按照时间段进行分区。每个数据文件只包含一个时间段的时序数据,时间段的长度由DB的配置参数days决定。这种按时间段分区的方法还便于高效实现数据的保留策略,只要数据文件超过规定的天数(系…

win10 Mysql8.0以上重置初始密码

第一步:关闭Mysql服务 首先,确保自己已经关闭了Mysql的服务 net stop mysql 问题:关闭时报错 原因是:因为net start 服务名,启动的是win下注册的服务。此时,系统中并没有注册mysql到服务中。即当前路径下…

【社区图书馆】《深入理解高并发编程:JDK核心技术》读后感

作者简介 首先要隆重介绍的肯定是《深入理解高并发编程:JDK核心技术》的作者:冰河,作为互联网资深技术专家、数据库技术专家、分布式与微服务架构专家。他多年来一直致力于分布式系统架构、微服务、分布式数据库、分布式事务与大数据技术的研…

【P41】JMeter 简单控制器(Simple Controller)

文章目录 一、简单控制器(Simple Controller)参数说明二、测试计划设计 一、简单控制器(Simple Controller)参数说明 该组件,是一个占位符,用于脚本模块化管理,无任何逻辑作用,也不…

0604嵌套路由与路由传参-react路由-react

文章目录 1 嵌套路由1.1 使用1.2 总结 2 路由传参2.1 示例准备2.1 传递params参数2.2 传递search参数2.3 传递state参数2.4 路由参数总结 结语 1 嵌套路由 1.1 使用 示例效果如下图1.1-1所示: 该示例代码其他部分和上一篇相同,这里主要讲解下嵌套路由的…

CVPR2023 I NeRF-Supervised Deep Stereo:不需要任何ground-truth数据

论文题目:NeRF-Supervised Deep Stereo 作者:Fabio Tosi ;Alessio Tonioni; Daniele De Gregorio等人 作者机构:University of Bologna(博洛尼亚大学);Google Inc(全球最大的搜索引擎之一);Eyecan.ai(韩国专注于开发眼动追踪技术的公司) 在公众号「3D视觉工坊」后台回复「…

老电脑重生:深度剖析各部件的羁绊关系

目录 引言: 正文: 主板: CPU 参数: 分类 接口 intel CPU升级推荐 AMD CPU升级推荐 CPU散热器: 内存条 硬盘 独立显卡 电源 机箱 总结 引言: 在科技日新月异的时代,我们与…

【从零到Offer】- HashMap与HashSet

​ HashMap与HashSet是我们日常最常使用的两个集合类。在实现上,两者也有很大的相似性。HashSet基本就是对HashMap的一个简单包装。 ​ 为了更好的理解Hash结构的实现原理,从而更好的指导我们的代码使用,本文就主要对HashMap的实现及设计做分…

Java并发体系-第二阶段-锁与同步-[3](仅做了解吧不好理解)

synchronized保证三大特性 synchronized保证原子性的原理 对num;增加同步代码块后,保证同一时间只有一个线程操作num;。就不会出现安全问题。 synchronized保证可见性的原理 synchronized保证可见性的原理,执行synchronized时,会对应lock…

下载STM32固件库

不想找的可直接输入下面的网址 https://www.st.com/en/embedded-software/stm32-standard-peripheral-libraries.html 官网下载的慢,阿里云链接 STM32固件 https://www.aliyundrive.com/s/e2Q3j19Bnkv 点击链接保存,或者复制本段内容,打开…

【UE】不规则物体外轮廓发光

效果 按下2键显示鼠标,将鼠标移动到指定的物体身上然后按下ctrl键就会使得指定物体高亮显示。 步骤 1. 创建一个材质并打开 材质域设置为后期处理 可混合位置改为“色调映射前” 添加如下节点: 2. 打开玩家控制的蓝图,添加如下节点 3. 场景…

新手装sql

windows sever 安装完了得装个sql,我也不会,按网上找到的资料,一步一步试吧 到这个地址去下载SQL Server https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 谁能救救我,全是英文,都看不懂&#xff0…

sentinel持久化

sentinel规则推送模式 原始模式 在sentinel源码中是不支持规则持久化的,一旦sentinel服务宕机,匹配的所有规则将彻底消失。在上篇博客中展示了sentinel的源码流程图,在sentinel dashboard新增一条流控规则(或者其他规则&#xf…

Boost开发指南-1.3date_time

date_time date_time库勇敢地面对了这个挑战,并成功地解决了大部分问题。它是一个非常全面且灵活的日期时间库,基于我们日常使用的公历(即格里高利历),可以提供时间相关的各种所需功能,如精确定义的时间点、时间段和时…

CSS入门学习笔记+案例【一】

目录 一、CSS 是什么 二、引入方式 2.2 行内样式表 2.3 外部样式 三、 代码风格 3.1 样式格式 3.2 样式大小写 3.3 空格规范 四、 选择器 4.1 选择器的功能 4.2 选择器的种类 复合选择器小结 看完这篇博客 你将 掌握 CSS 基本语法规范和代码书写风格 掌握 CSS 选择…

ARM微架构

目录 1.流水线 2.指令流水线 3. 多核处理器​编辑 4. 工程搭建 4.1为Keil软件配置编译工具链 5.程序编写 5.1 数据处理指令 5.2 带标志位的加法ADC ADDS 5.3 跳转指令B\BL 5.4 单寄存器内存访问 5.5 批量寄存器内存访问 5.6 满减操作 1.流水线 2.指令流水线 3.…

Ansible从入门到精通【三】

大家好,我是早九晚十二,目前是做运维相关的工作。写博客是为了积累,希望大家一起进步! 我的主页:早九晚十二 专栏名称:Ansible从入门到精通 立志成为ansible大佬 ♣ansible的高级指令 ansible-playbook写一…

Java 集合中 ArrayList 的扩容机制原理(面试+读源码)

在 Java 中,ArrayList 内部是通过一个数组来存储元素的,是一个数组结构的存储容器。当向一个 ArrayList 中添加元素时,如果当前数组已经满了,就需要扩容。 集合的继承关系图 一、面试回答 ( ArrayList 的扩容机制原理 ) 面试…