Skip to content

银行家算法

考情分析

银行家算法是 408 大题的常考内容,需要完整手算安全序列。属于 🔥🔥🔥 高频核心。

死锁预防是"一刀切"地破坏必要条件,代价高。银行家算法更聪明——每次分配资源前先模拟一下,如果分完之后系统还能找到一条让所有进程都完成的路径,就批准;否则就让进程等着。

核心思想

银行家算法的思想来源于银行贷款:银行在发放贷款前要判断是否会导致资金无法回收。类比到操作系统:在分配资源前判断是否会导致死锁。

核心:每次分配资源前,先假设分配,然后用安全性算法检查是否仍处于安全状态。

数据结构

设系统有 n 个进程,m 种资源:

数据结构维度含义
Available1×m各类资源的可用数量
Maxn×m每个进程对各类资源的最大需求
Allocationn×m每个进程已分配的各类资源数量
Needn×m每个进程还需要的各类资源数量

关键关系Need[i] = Max[i] - Allocation[i]

安全性算法

用于判断当前状态是否安全(是否存在安全序列):

1. 初始化:
   Work = Available        // 工作向量,表示系统可提供的资源
   Finish[i] = false       // 所有进程标记为未完成

2. 查找一个满足条件的进程 P_i:
   Finish[i] == false 且 Need[i] <= Work

3. 如果找到:
   Work = Work + Allocation[i]  // 模拟回收该进程的资源
   Finish[i] = true
   回到步骤 2

4. 如果所有 Finish[i] == true:
   系统处于安全状态,找到的顺序就是安全序列
   否则: 不安全

完整算例

设有 3 种资源 A、B、C,总量为 (10, 5, 7),5 个进程:

进程Max(A,B,C)Allocation(A,B,C)Need(A,B,C)
P07, 5, 30, 1, 07, 4, 3
P13, 2, 22, 0, 01, 2, 2
P29, 0, 23, 0, 26, 0, 0
P32, 2, 22, 1, 10, 1, 1
P44, 3, 30, 0, 24, 3, 1

Available = (10-7, 5-2, 7-5) = (3, 3, 2)

安全性检查

步骤Work(A,B,C)选择进程Need ≤ Work?执行后 Work
13, 3, 2P1(1,2,2)≤(3,3,2) ✓3+2, 3+0, 2+0 = 5, 3, 2
25, 3, 2P3(0,1,1)≤(5,3,2) ✓5+2, 3+1, 2+1 = 7, 4, 3
37, 4, 3P4(4,3,1)≤(7,4,3) ✓7+0, 4+0, 3+2 = 7, 4, 5
47, 4, 5P0(7,4,3)≤(7,4,5) ✓7+0, 4+1, 5+0 = 7, 5, 5
57, 5, 5P2(6,0,0)≤(7,5,5) ✓10, 5, 7

安全序列:P1 → P3 → P4 → P0 → P2(安全序列不唯一)

资源请求处理

假设 P1 请求 Request = (1, 0, 2):

  1. 检查 Request ≤ Need[P1]:(1,0,2) ≤ (1,2,2) ✓
  2. 检查 Request ≤ Available:(1,0,2) ≤ (3,3,2) ✓
  3. 试探分配:
    • Available = (3,3,2) - (1,0,2) = (2, 3, 0)
    • Allocation[P1] = (2,0,0) + (1,0,2) = (3, 0, 2)
    • Need[P1] = (1,2,2) - (1,0,2) = (0, 2, 0)
  4. 执行安全性算法检查新状态是否安全

如果安全 → 正式分配;如果不安全 → 撤销试探分配,进程等待。

交互可视化

加载可视化中...

算法的局限性

局限说明
需要预知 Max进程必须事先声明最大资源需求
效率低每次分配都要执行安全性检查
进程数固定不适合进程数动态变化的系统

易错

银行家算法计算中最常见的错误:

  • 进程完成后释放的资源是 Allocation(已持有的),不是 Need(还需要的)。即 Work=Work+Allocationi,不是 Work+Needi
  • 安全序列不唯一,但不安全状态是确定的——只要找不到任何安全序列就是不安全
  • "不安全状态"≠"死锁":不安全状态只是可能死锁,不是一定

考研高频考点

  • 🔥🔥🔥 手算安全序列(给定 Max/Allocation/Available,逐步计算 Work)
  • 🔥🔥🔥 处理资源请求的三步检查(Request≤Need, Request≤Available, 安全性检查)
  • 🔥🔥 Need = Max - Allocation
  • 🔥🔥 安全序列不唯一
  • 🔥 银行家算法属于死锁避免(不是预防也不是检测)

银行家算法是"事前预防",但如果觉得这个检查开销太大、愿意冒一点风险呢?下一篇看死锁检测与解除——先让死锁发生,再处理。

真题练习

相关真题(8题)

2024Q26选择题2分

银行家算法:判断安全序列个数

2021Q28选择题2分

银行家算法:检测给定时刻的安全序列

2019Q30选择题2分

死锁:银行家算法用于避免死锁而非检测死锁

2018Q26选择题2分

安全性检测:可用资源=4-2-1-0=1,只够P3先执行

2015Q26选择题2分

死锁避免vs检测:避免需要资源总量信息且拒绝不安全分配,不限制申请顺序

2013Q32选择题2分

银行家算法:避免死锁而非预防,安全状态一定无死锁,不安全不一定死锁

2012Q27选择题2分

银行家算法:根据资源分配表找出安全序列

2011Q27选择题2分

银行家算法:系统处于不安全状态,不存在安全序列