当前位置: 首页 > news >正文

【架构-20】死锁

什么是死锁?

在这里插入图片描述

死锁(Deadlock)是指两个或多个线程/进程在执行过程中,由于资源的互相占用和等待,而陷入一种互相等待的僵局,无法继续往下执行的情况。
产生死锁的四个必要条件:
(1)互斥条件(Mutual Exclusion):至少有一个资源是非共享的,即在一个时间内只由一个线程/进程占用。
(2)占有并等待(Hold and Wait):一个线程/进程已经占用了至少一个资源,并且在等待获取其他资源。
(3)不可剥夺(No Preemption):资源只能被线程/进程自愿释放,不能被强制剥夺。
(4)循环等待(Circular Wait):两个或多个线程/进程之间形成一种头尾相接的循环等待资源关系。

一个具体的死锁场景

如下:
假设有两个线程T1和T2,各自需要两个资源A和B。

(1)T1首先申请并获得了资源A,T2首先申请并获得了资源B。
(2)之后T1申请资源B,但被阻塞,因为资源B已经被T2占用。
(3)同时T2申请资源A,但也被阻塞,因为资源A已经被T1占用。
(4)此时双方都在等待对方释放资源,形成了死锁。

这种情况下,T1和T2将永远阻塞下去,无法继续执行,除非有外部干预。

因此,避免死锁的关键是要及时发现并及时打破其中的一个条件。通常可以通过合理的资源申请顺序、死锁检测和资源抢占等方式来预防和解决死锁问题。

常见的死锁场景

  1. 多个线程/进程占用部分资源,又互相等待其他资源,形成循环等待。
  2. 某个线程/进程获得资源后不及时释放,造成其他线程/进程无法获得所需资源。
  3. 资源分配不合理,导致资源耗尽或分配不均。
  4. 系统管理不善,未对资源访问顺序等进行合理控制。

如何预防死锁?

预防和避免死锁主要有以下几种常见的方法:

  1. 合理的资源分配和申请顺序
    给每个线程/进程分配资源时遵循固定的顺序
    申请资源时按照固定顺序申请,防止循环等待
  2. 死锁检测和解决
    动态检测系统中是否存在死锁
    一旦发现死锁,通过抢占资源或者回滚等方式打破死锁
  3. 资源有限分配
    限制系统中资源的总量,防止资源耗尽
    合理分配资源,避免某些线程/进程占用太多资源
  4. 破坏不可抢占条件
    允许强制从一个线程/进程中获取资源
    当资源被占用时,可以暂时将其抢占回来
  5. 利用死锁避免算法
    如银行家算法等,动态检查并拒绝可能导致死锁的资源分配请求
  6. 合理的线程/进程执行顺序
    按照一定的调度策略,合理安排线程/进程的执行顺序
  7. 超时检测和处理
    对于长时间阻塞的线程/进程,可以主动超时中止,避免永久阻塞

总之,预防死锁需要从多个方面着手,既要从设计层面预防,又要在运行时动态监测和处理。只有采取多种措施,才能更好地避免和解决死锁问题。

银行家算法?

假设你是一家银行的银行家,你负责管理银行的资金分配。银行里有很多客户(相当于进程),每个客户都有一定的贷款需求(相当于资源需求)。

当一个新客户来申请贷款时,作为银行家你需要做以下几步:

  1. 先弄清楚每个客户的最大贷款需求是多少(系统需要提前知道每个进程的最大资源需求)。
  2. 你要保持一个可用资金池,记录银行当前还有多少可用的资金(相当于可用资源向量)。
  3. 当新客户来申请贷款时,你要先检查能否满足他的需求,如果可以就批准贷款;如果不行,就暂时把他的申请放在等待队列里(相当于将该请求暂时保存)。
  4. 你会定期检查等待队列里的申请,看看是否能安全地满足某些申请(相当于检查等待队列中的请求)。
  5. 如果你能找到一个"安全序列",即按照某个顺序依次满足所有客户的贷款需求,那么说明系统处于安全状态,你可以批准贷款;否则你就拒绝贷款申请(相当于判断系统是否处于安全状态)。

这就是银行家算法的核心思想。它可以动态地检测系统是否处于安全状态,从而避免发生"死锁"(即客户永远无法获得贷款)。这种算法在操作系统、数据库等领域都有广泛应用。

银行家算法的基本思想和优点?

银行家算法(Banker’s Algorithm)是一种预防死锁的常见算法,它是由操作系统先驱E.W. Dijkstra提出的。

银行家算法的基本思想是:

  1. 系统需要提前知道每个进程所需的最大资源需求。
  2. 系统保持一个可用资源向量,记录当前系统中可用的各类资源数量。
  3. 当进程请求资源时,系统先检查是否能满足这个请求,如果可以,则分配资源;如果不可以,则将该请求暂时保存在等待队列中。
  4. 系统会周期性地检查等待队列中的请求,看是否可以安全地满足某些请求。
  5. 如果系统能找到一个安全序列,即能按照这个序列依次满足所有进程的资源需求,则认为系统处于安全状态,可以分配资源。否则拒绝分配资源。

银行家算法的优点是:
(1)能够动态地检测系统是否处于安全状态,防止发生死锁。
(2)能够合理地分配资源,最大化资源利用率。
(3)相对简单易实现,可以应用于多种资源分配场景。

相关文章:

【架构-20】死锁

什么是死锁? 死锁(Deadlock)是指两个或多个线程/进程在执行过程中,由于资源的互相占用和等待,而陷入一种互相等待的僵局,无法继续往下执行的情况。 产生死锁的四个必要条件: (1)互斥条件(Mutual Exclusion):至少有一个资源是非共享…...

Chat2DB:AI引领下的全链路数据库管理新纪元

一、引言 随着数据驱动决策成为现代企业和组织的核心竞争力,数据库管理工具的重要性日益凸显。然而,传统的数据库管理工具往往存在操作复杂、功能单一、不支持多类型数据库管理等问题,限制了数据的有效利用。为了打破这一局面,Ch…...

数据库的学习(5)

题目: 1、新增员工表emp和部门表dept create table dept (deptl int,dept name varchar(11)) charsetutf8; create table emp (sid int,name varchar(11),age int,worktime start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,财务), (…...

v-bind指令——03

v-bind 指令详解&#xff1a; 1 、这个指令是干嘛的&#xff1f; 可以让html标签的某个属性的值产生动态的效果 2、v-bind指令的语法格式&#xff1a;<HTML 标签 v-bind : 参数 “表达式”> </HTML> 3、v-bind指令的编译原理&#xff1a; 编译前&#xff1a…...

RedisTemplate使用

文章目录 RedisTemplate使用String类型Hash类型List类型Set类型Zset类型 RedisTemplate使用 String类型 Overridepublic void testString() {// t11();String key "k1";String currentNum;// 用法1&#xff1a;key是否存在Boolean value client.hasKey(key);log.i…...

文献解读-多组学-第十八期|《整合 WES 和 RNA-Seq 数据以进行短变异发现》

关键词&#xff1a;多组学&#xff1b;基因测序&#xff1b;变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Integrating WES and RNA-Seq Data For Short Variant Discovery标题&#xff08;中文&#xff09;&#xff1a;整合 WES 和 RNA-Seq 数…...

科学技术奖 | 畜禽粪污源头减排关键技术推广与种养循环一体化农业实践

...

【漏洞复现】锐捷校园网自助服务系统 任意文件读取

声明&#xff1a;本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动&#xff0c;将与本文档的作者或发布者无关。 一、漏洞描述 锐捷校园网自助服务系统是用于学校网络管理的一个平台&#xff0c;login_judge.jsf接口存在任意文件读取…...

Centos9安装部署及静态ip配置方案

一、获取centos9的iso镜像 去官网 点击download 官网 点击x86&#xff0c;下载centos9 二、创建虚拟机 1、点击新建虚拟机 2、选择自定义 下一步 3、点击下一步 4、选择稍后安装操作系统 点击下一步 5、选择linux 选择要安装的centos 版本 这里选择centos7 6、设置虚拟…...

利用Altair One 云平台,轻松实现全球企业产品研发创新与优化

在过去的几十年里&#xff0c;工程师和数据科学家引入了大量改变世界的技术&#xff0c;但他们的工作方式却出人意料地停滞不前。技术的革新也带来了效率的不断提升。 面对众多企业的同样难题&#xff0c;Altair整合产品&#xff0c;创造出了用于协作工程、数据工程和分析应用程…...

数据库树状查询

SQL Server 树状查询 -- 创建临时表或者使用CTE WITH OrganizationTree AS (-- 定义递归的终止条件SELECT id, parent_id, name, 1 AS LevelFROM org_structureWHERE parent_id IS NULLUNION ALL-- 定义递归部分&#xff0c;这里的Level是为了记录树的层级SELECT o.id, o.pare…...

【实战场景】@Transactional中使用for update的注意点

【实战场景】Transactional中使用for update的注意点 开篇词&#xff1a;干货篇&#xff1a;知识回顾注意点1.锁的范围和粒度&#xff1a;2.事务的隔离级别&#xff1a;3.死锁&#xff1a;4.性能影响&#xff1a;5.事务的边界&#xff1a;6.异常处理&#xff1a;7. 数据库和存储…...

好用的声音分析的软件和网站

有许多软件和网站可以帮助进行声音分析&#xff0c;从专业级的音频处理软件到在线工具&#xff0c;以下是一些推荐&#xff1a; 专业音频分析软件 Audacity 开源且免费的音频编辑和分析工具。提供基本的音频录制、编辑和分析功能。支持多种插件&#xff0c;扩展其功能。 Adob…...

开发情绪识别人工智能时的道德考量

情绪调节人工智能是机器学习领域的最新技术进步之一。尽管它显示出巨大的潜力&#xff0c;但道德问题将影响其采用率和寿命。人工智能开发人员能克服这些问题吗&#xff1f; 什么是情绪识别人工智能&#xff1f; 情绪识别人工智能是一种机器学习模型。它通常依赖于计算机视觉…...

MongoDB:基础语句及练习

一 基本命令 1.显示所有数据库 show dbs show databases 2.进入某个数据库 use 数据库名称 3.显示当前数据库信息 db.stats() 4.显示当前数据库的所有集合 show collections 5.显示当前数据库 db 在 MongoDB 里&#xff0c;数据库和集合都不用手动创建&#xff1a; 当使用“us…...

百度智能云创新业务部总经理李想:发挥AI企业科技创新优势 助力职业教育人才扬帆远航

前言&#xff1a;百度智能云教育行业解决方案作为百度智能云旗下的创新力量&#xff0c;专注于培养“AI教育”领域的新质生产力人才&#xff0c;一直以来备受职业教育领域的关注。在第六届人工智能“职教百强”院校长论坛开幕之际&#xff0c;中教全媒体对话论坛嘉宾百度智能云…...

了解股票沽空及其风险

什么是股票沽空&#xff1f; 股票沽空是一种投资策略&#xff0c;投资者通过借入股票并在市场上卖出&#xff0c;期望在未来以更低的价格买回股票&#xff0c;以赚取价差收益。这一策略在市场下跌时尤为常见&#xff0c;因为投资者可以从股票价格的下跌中获利​。 股票沽空的…...

【Sql Server修改列类型错误信息:对象名依赖于列】

Sql Server修改列类型错误信息&#xff1a;对象名依赖于列 报错信息解决方法测试sql语句 报错信息 修改表中列类型&#xff0c;发生报错如下&#xff1a; [SQL Server]对象DF__Forecast___isCal__4E746892 依赖于 列isCalcFinished。 (5074) [42000] [Microsoft][ODBC Driver…...

【ACM珠海分会,IEEE Fellow加盟,CPS出版】第四届管理科学和软件工程国际学术会议(ICMSSE 2024,7月19-21)

第四届管理科学和软件工程国际学术会议(ICMSSE 2024)由ACM珠海分会&#xff0c;广州番禺职业技术学院主办&#xff1b;全国区块链行业产教融合共同体&#xff0c;AEIC学术交流中心承办&#xff0c;将于2024年7月19-21日于广州召开。 会议旨在为从事管理与软件工程领域的专家学…...

kmeans.fit_predict 和 kmeans.fit有什么区别

KMeans 是 scikit-learn 库中用于执行 K-means 聚类算法的类。fit_predict 和 fit 是该类中的两个方法&#xff0c;的主要区别在于返回的内容和用途。 kmeans.fit: 用途: 用于训练 K-means 模型。输入: 接受一个特征矩阵&#xff08;通常是二维数组&#xff09;作为输入。输出:…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...