news 2026/9/2 5:01:05

Bilibili 三面: 资源分配图中存在环路则一定出现死锁么?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Bilibili 三面: 资源分配图中存在环路则一定出现死锁么?

👉这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:

  • 《项目实战(视频)》:从书中学,往事上“练”

  • 《互联网高频面试题》:面朝简历学习,春暖花开

  • 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题

  • 《精进 Java 学习指南》:系统学习,互联网主流技术栈

  • 《必读 Java 源码专栏》:知其然,知其所以然

👉这是一个或许对你有用的开源项目

国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构

RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRMAI大模型、IoT物联网等功能:

  • 多模块:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 微服务:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本

来源:飞天小牛肉

  • 前言

  • 死锁检测模型

  • 每种资源类型一个实例

  • 每种资源类型多个实例

  • 总结


前言

死锁避免算法大部分小伙伴应该都能说出来 “银行家算法”,死锁检测算法确实不常问也不常见,最近在一篇 Bilibili 的三面面经中看见了死锁检测算法,遂写出此文。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

死锁检测模型

在并发系统中,多个进程可能会因为资源竞争而陷入死锁。死锁检测模型提供了一种机制,通过将系统状态抽象为资源分配图,来识别死锁的存在。在这个图中,每个进程和资源都被表示为节点,资源和进程之间的有向边表示资源的分配和请求。

可证明结论:

  • 无环安全状态:如果资源分配图是一个无环图,系统处于安全状态,因为存在一种资源分配序列可以使得所有进程顺利完成。

  • 环存在不确定性:如果图中存在环,系统处于不安全状态,但不一定处于死锁状态

    • 当每种资源类型只有一个实例时,死锁一定发生

    • 如果资源类型有多个实例,系统也可能通过资源的动态分配来避免死锁

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

每种资源类型一个实例

上图为资源分配图,其中方框表示资源,圆圈表示进程。资源指向进程表示该资源已经分配给该进程,进程指向资源表示进程请求获取该资源。

图 a 可以抽取出环,如图 b,它满足了环路等待条件,因此一定会发生死锁。

每种类型一个资源的死锁检测算法是通过检测有向图是否存在环来实现,从一个节点出发进行深度优先搜索,对访问过的节点进行标记,如果访问了已经标记的节点,就表示有向图存在环,也就是检测到死锁的发生。具体算法描述如下:

  1. 初始化:创建一个资源分配图,用有向边表示资源和进程之间的关系。

  2. 深度优先搜索(DFS):从任意一个进程开始,进行深度优先搜索。

  3. 标记访问:在搜索过程中,对访问过的节点(进程)进行标记。

  4. 检测环:如果在搜索中遇到了已经被标记的节点,说明存在环,即检测到死锁。

详细算法步骤:

  1. 选择一个未访问的进程作为起点。

  2. 进行DFS,访问其相邻的资源节点。

  3. 标记该进程为已访问。

  4. 如果从该进程出发可以回到任何已标记的进程,则存在死锁。

  5. 如果所有进程都被访问且没有形成环,则没有死锁。

每种资源类型多个实例

上图中,有三个进程四个资源,每个数据代表的含义如下:

  • E 向量:资源总量

  • A 向量:资源剩余量

  • C 矩阵:每个进程所拥有的资源数量,每一行都代表一个进程拥有资源的数量(P1、P2、P3 三个进程)

  • R 矩阵:每个进程请求的资源数量

进程 P1 和 P2 所请求的资源都得不到满足,只有进程 P3 可以,因此我们让 P3 先执行,之后释放 P3 拥有的资源,此时 A = (2 2 2 0)。这样的话 P2 就可以执行了,执行后释放 P2 拥有的资源,A = (4 2 2 1) 。P1 也可以执行了。所有的进程都可以顺利执行,所以没有死锁。具体算法描述如下:

  1. 初始化:定义E(资源总量)、A(资源剩余量)、C(进程拥有的资源矩阵)和R(进程请求的资源矩阵)。

  2. 寻找可执行进程:选择一个请求资源不超过A的进程执行。

  3. 资源分配:将该进程请求的资源分配给它,并更新A和C。

  4. 进程完成:当进程执行完毕后,将其拥有的资源释放回A,并更新C。如果所有线程都可以顺利执行完毕,则没有死锁

详细算法步骤:

  1. 标记所有进程为未标记。

  2. 从所有未标记的进程中选择一个,其请求的资源向量Ri小于等于A。

  3. 将该进程的资源需求从A中减去,并更新C矩阵,标记该进程为已执行。

  4. 如果没有这样的进程,检查是否有任何进程可以执行。如果没有,则检测到死锁

  5. 重复步骤2和3,直到所有进程都被标记为已执行或检测到死锁

总结

总结下:

  • 对于每种资源类型一个实例的场景,若有环则必死锁;其死锁检测算法基于图论中的环检测技术,将死锁检测问题转化为有向图中的环判断问题

  • 对于没中资源类型多个实例的场景,有环不一定死锁;其死锁检测算法通过模拟资源分配和回收过程,检测是否存在一系列进程可以顺利获取资源完成执行,从而判断系统是否处于死锁状态


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。 谢谢支持哟 (*^__^*)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 23:58:26

基于springboot健康管理微信小程序的设计与实现

随着人们健康意识的不断提升,健康管理类应用需求日益增长。本文设计并实现了一款基于微信小程序的健康管理系统,采用Java语言开发,结合Spring Boot框架和MySQL数据库,为用户提供全方位的健康管理服务。该系统涵盖用户管理、健康数…

作者头像 李华
网站建设 2026/9/2 8:19:18

一键化部署、标准化、闭环式的运营商数据安全泛监测管理方案

一、概要(提示:以“一键化部署、标准化能力、闭环式治理”为主线,构建可快速落地的运营商数据安全监测实践体系。)在通信行业数字化持续深化的背景下,运营商已从“数据产生者”转变为“高价值数据运营主体”&#xff0…

作者头像 李华
网站建设 2026/9/2 21:34:49

深度解析 ARP 欺骗攻击:原理、实战与防御全攻略!

什么是ARP欺骗攻击 ARP协议: 在以太网中,是用MAC地址来进行通讯的。所以要用 ARP 协议将 IP 地址解析成 MAC 地址。ARP 协议就是通过目的 IP 询问设备的 MAC 地址。局域网中的每一台设备都有一个 ARP 缓存表,表中存放 IP 和 MAC 地址的对应…

作者头像 李华