首页/操作系统/进程管理/死锁的避免 🔗 在 Obsidian 中打开
操作系统 · 进程管理

死锁的避免

重要度 ★★★★★ 死锁避免银行家算法安全序列安全状态
速查
死锁避免是事中策略:每次资源分配前检查系统是否仍安全。核心算法是银行家算法,用 Need = Max − Allocation 做安全性检查,时间复杂度 $O(m \times n^2)$

核心概念

死锁避免是一种事中策略:在每次资源分配前,检查分配后系统是否仍处于安全状态。如果安全则分配,否则拒绝。

安全状态 vs 不安全状态

  • 安全状态:存在一个安全序列,使所有进程都能顺利完成。
  • 不安全状态:不存在安全序列,可能死锁(不一定死锁)。
  • 安全状态 → 一定不死锁;不安全状态 → 可能死锁。

银行家算法

  • 数据结构:Available(可用资源)、Max(最大需求)、Allocation(已分配)、Need(剩余需求,$Need = Max - Allocation$)。
  • 安全性检查:找一个 $Need \leq Available$ 的进程 $P_i$ → 假设其执行完并释放资源 $Available \mathrel{+}= Allocation[i]$ → 标记完成,重复。
  • 所有进程都完成 → 安全;找不到满足条件的进程 → 不安全。

资源请求处理

  1. 检查 $Request \leq Need$(否则出错);
  2. 检查 $Request \leq Available$(否则等待);
  3. 试探性分配:$Available \mathrel{-}= Request,\; Allocation \mathrel{+}= Request,\; Need \mathrel{-}= Request$;
  4. 执行安全性检查:安全 → 正式分配;不安全 → 撤销试探性分配。

关键性质

数据结构含义维度
Available当前可用资源向量m 维
Max最大需求矩阵$n \times m$
Allocation已分配矩阵$n \times m$
Need剩余需求矩阵(= Max − Allocation)$n \times m$

常见考法

考法解题套路
安全性检查找 $Need \leq Available$ 的进程,执行后释放资源,重复
判断是否安全存在安全序列 → 安全;找不到 → 不安全
资源请求处理检查 $Request \leq Need$ 与 $\leq Available$ 后试探分配,再做安全性检查
Need 矩阵计算$Need = Max - Allocation$(不是 Max − Available)
安全序列个数可能多个,找到一个即可

易错点

必记
  1. ⚠️ $Need = Max - Allocation$,不是 $Max - Available$(最常见错误)。
  2. ⚠️ 安全性检查时 Available 是累计的——每完成一个进程就加上它释放的资源。
  3. ⚠️ 不安全状态不一定死锁——只是可能死锁。
  4. ⚠️ 试探性分配失败后要撤销(恢复原来的 Available / Allocation / Need)。

记忆卡片

银行家算法核心思想?
资源分配前检查系统是否仍安全(存在安全序列)。
Need 矩阵怎么算?
$Need = Max - Allocation$。
安全 / 不安全与死锁?
安全→一定不死锁;不安全→可能死锁。
安全性检查时间复杂度?
$O(m \times n^2)$(m 资源类数,n 进程数)。

交互动画 · 银行家算法安全性检查

Available (A,B,C) 3,3,2 进程(Need A,B,C) P0 7,4,3 P1 1,2,2 P2 6,0,0 P3 0,1,1 安全性检查流程 选择 Need≤Avail的进程 Pi执行完释放资源
初始 Available=(3,3,2)。点击「下一步」逐步找出安全序列。
提示:P1 的 Need(1,2,2) ≤ (3,3,2),可作为首个完成进程。
示例:Max/Allocation 见教材标准例题;P1→P3→P4→P0→P2 构成一条安全序列,故系统安全。

相关知识点

deadlock deadlock-prevention deadlock-detection-and-recovery

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。