【架构-20】死锁

news/2024/7/8 4:48:54 标签: 架构, java, 数据库, , 死锁, 银行家算法

什么是死

在这里插入图片描述

(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)相对简单易实现,可以应用于多种资源分配场景。


http://www.niftyadmin.cn/n/5536478.html

相关文章

太速科技-FMC209-基于FMC的4路125MAD输入、2路1GDA输出子卡

FMC209-基于FMC的4路125MAD输入、2路1GDA输出子卡 一、板卡概述 本子卡基于FMC连接器实现4路125M采样率AD输出,两路1G采样率DA输出子卡,板卡默认由FMC连接器12V供电,支持外参考时钟,外输入时钟,外触发。 …

掌握MySQL基础命令:数据更新操作详细操作(数据的增删改)

MySQL数据修改是指使用SQL语句(如UPDATE、INSERT、DELETE)对数据库表中的数据进行更改、添加或删除的操作,常见的操作包括更新表中的记录、插入新记录以及删除现有记录 。 一、数据插入 1插入完整的数据记录 2插入非完整的数据记录 3插入多…

数据预处理:统计关联性分析/数据清洗/数据增强/特征工程实例

专栏介绍 1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。 2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。 3.需要强调的是,专栏仅介绍主…

flutter开发实战-解决release下Error: SocketException: Failed host lookup问题

flutter开发实战-解决release下Error: SocketException: Failed host lookup问题 当在开发App过程中,在Debug下接口访问正常,但是通过flutter build apk lib/main.dart --release打包后安装,发现Android手机上无法请求数据,报Err…

不到 5 元的随身 WiFi 刷 Debian 系统 做轻量家庭服务器

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 前不久在某宝均价 5 元买了两个随身 WiFi,拆机看了看丝印都是 MSM8916 ,正好是红米 2 同款的骁龙 410 的芯片,可以刷个 Debian 当作家庭服务器来跑一些轻量的服务。 不过手气不是很好,两个都是 512M + 4G 的配置…

密码学复习

目录 基础 欧拉函数 欧拉函数φ(n)定义 计算方法的技巧 当a=a_1*a_2*……*a_n时 欧拉定理 剩余系 一些超简单密码 维吉尼亚 密钥fox 凯撒(直接偏移) 凯特巴氏(颠倒字母表) 摩斯密码(字母对应电荷线) 希尔(hill)密码 一些攻击 RSA 求uf+vg=1 快速幂模m^…

MySQL InnoDB Cluster 高可用集群部署

MySQL InnoDB Cluster 简介 官方文档:https://dev.mysql.com/doc/refman/8.4/en/mysql-innodb-cluster-introduction.html 本章介绍 MySQL InnoDB Cluster,它结合了 MySQL 技术,使您能够部署和管理完整的 MySQL 集成高可用性解决方案。 说…

FullCalendar日历组件集成实战(17)

背景 有一些应用系统或应用功能,如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件,但功能比较简单,用来做数据展现勉强可用。但如果需要进行复杂的数据展示,以及互动操作如通过点击添加事件&#xff0…