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

死锁的避免

1. 核心思想

        死锁避免属于动态预防策略

  • 不破坏死锁必要条件,而是在资源分配前动态检查安全性
  • 仅当分配资源后系统仍处于安全状态时,才允许分配;否则让进程等待。

2. 系统安全状态与安全序列

(1)安全状态
  • 定义:系统能按某种进程推进顺序(安全序列) 为所有进程分配资源,使每个进程都能顺利完成。
  • 安全序列:存在一个进程序列 ( {P_1, P_2, ..., P_n} ),使得每个进程 ( P_i) 的剩余资源需求可通过当前系统可用资源 + 所有 ( P_j (j < i) ) 已分配资源满足。

  • 系统资源总量:(10, 5, 7)
  • 已分配资源:P1: (2, 1, 2), P2: (3, 0, 2), P3: (2, 1, 1)
  • 剩余需求:P1: (3, 4, 7), P2: (1, 2, 2), P3: (0, 1, 1)
  • 可用资源:(3, 3, 2)
  • 安全序列( P2 \rightarrow P3 \rightarrow P1 )(P2完成后释放资源,满足P3;P3完成后释放资源,满足P1)。

(2)不安全状态
  • 定义:系统找不到任何安全序列,可能导致死锁(但未必已发生死锁)。

3. 银行家算法(Banker's Algorithm)

模拟银行放贷策略,确保资源分配后系统仍安全。

(1)核心数据结构
  • Available:可用资源向量(当前系统空闲资源)。
  • Max:最大需求矩阵(每个进程对各类资源的最大需求)。
  • Allocation:分配矩阵(每个进程已获得的资源)。
  • Need:需求矩阵(每个进程仍需的资源,( Need[i][j] = Max[i][j] - Allocation[i][j] ))。
(2)分配步骤
  1. 进程请求资源:进程 ( P_i ) 发出请求向量 ( Request[i] )。
  2. 初步检查
  • 若 ( Request[i][j] > Need[i][j] )(请求超出需求),拒绝。
  • 若 ( Request[i][j] > Available[j] )(资源不足),进程等待。

     3.  试探分配:假设分配资源:

Available[j] -= Request[i][j] 
Allocation[i][j] += Request[i][j] 
Need[i][j] -= Request[i][j]

  4.安全性检查:判断分配后系统是否存在安全序列:

  • 初始化 Work = AvailableFinish[i] = false
  • 寻找满足 ( Need[i][j] \leq Work[j] ) 且 ( Finish[i] = false ) 的进程 (P_i)。
  • 假设 ( P_i ) 完成,释放资源:( Work[j] += Allocation[i][j] ),标记 ( Finish[i] = true )。
  • 重复上述步骤,若所有 ( Finish[i] = true ),则系统安全,允许分配;否则撤销试探,进程等待。

4. 安全状态与死锁的关系

  • 安全状态 → 一定不会死锁。
  • 不安全状态 → 可能死锁(但非必然,取决于进程推进顺序)。
  • 银行家算法的目标:确保系统始终处于安全状态,从而避免死锁。

详细银行家算法请看-- 银行家算法详解-CSDN博客


核心考点 📌

  1. 安全序列的判断:根据资源分配情况,能否找到一个进程推进顺序使所有进程完成。
  2. 银行家算法步骤:请求检查 → 试探分配 → 安全性检查 → 决定是否分配。
  3. 安全状态的意义:是避免死锁的核心,系统必须在安全状态下才能分配资源。

总结

        死锁避免通过动态检查资源分配安全性来预防死锁,不破坏必要条件。系统安全状态指存在进程执行序列(安全序列)使所有进程都能完成,银行家算法模拟银行放贷策略,在分配资源前检查系统是否仍安全。其核心步骤包括请求检查、试探分配和安全性检查,确保每次分配后系统存在安全序列。安全状态一定不会死锁,不安全状态可能死锁。银行家算法通过维持安全状态避免死锁。

一句话记忆:死锁避免通过银行家算法动态检查资源分配安全性,确保系统始终存在安全序列,从而在不破坏死锁条件的前提下避免死锁! ✨

http://www.xdnf.cn/news/1108747.html

相关文章:

  • LangChain 内存(Memory)
  • 创建uniapp项目引入uni-id用户体系使用beforeRegister钩子创建默认昵称
  • 9. JVM垃圾回收
  • 12. JVM的垃圾回收器
  • Agent 设计模式
  • 前后端分离项目的完整部署(Jenkins自动化部署)
  • 【从零开始编写数据库:基于Python语言实现数据库ToyDB的ACID特性】
  • 27.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(一)
  • Android下一个简单的定时器,每隔一秒输出一个数字
  • Syntax Error: TypeError: Cannot set properties of undefined (setting ‘parent‘)
  • vue3 canvas 选择器 Canvas 增加页面性能
  • Kimi K2万亿参数开源模型原理介绍
  • 【论文阅读】HCCF:Hypergraph Contrastive Collaborative Filtering
  • 缓存三剑客解决方案
  • 【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序
  • 利用docker部署前后端分离项目
  • 敏捷开发方法全景解析
  • SQL server之版本的初认知
  • C#枚举:从基础到高级的全方位解析
  • 《通信原理》学习笔记——第一章
  • 《Spring 中上下文传递的那些事儿》Part 11:上下文传递最佳实践总结与架构演进方向
  • 基于MCP的CI/CD流水线:自动化部署到云平台的实践
  • Vue Vue-route (5)
  • Adobe Illustrator关于图标创建的问题
  • 【跟我学运维】chkconfig jenkins on的含义
  • 初等行变换会改变矩阵的什么?不变改变矩阵的什么?求什么时需要初等行变换?求什么时不能初等行变换?
  • 回归(多项式回归)
  • 电网通俗解析术语2:一二次设备关联
  • 【PycharmPyqt designer桌面程序设计】
  • Effective Modern C++ 条款9:优先考虑别名声明而非typedef