1. 银行家算法概述
银行家算法是操作系统中最具代表性的死锁避免算法之一。这个算法的名称来源于银行家管理资金的类比:操作系统相当于银行家,系统资源相当于资金,而进程则相当于向银行家申请贷款的客户。
1.1 算法核心思想
银行家算法的核心在于资源分配前的安全性检查。当进程请求资源时,系统会:
- 检查请求是否超过进程声明的最大需求量
- 检查系统当前是否有足够可用资源
- 模拟分配后的系统状态
- 执行安全性算法检查系统是否仍处于安全状态
只有在满足所有条件的情况下,系统才会实际分配资源,否则会让进程等待。
1.2 死锁的必要条件
要理解银行家算法的重要性,首先需要了解死锁产生的四个必要条件:
- 互斥条件:资源一次只能由一个进程独占使用
- 请求与保持条件:进程持有资源的同时请求其他资源
- 非剥夺条件:已分配的资源不能被强制剥夺
- 循环等待条件:存在进程-资源的循环等待链
银行家算法通过破坏第四个条件(循环等待)来避免死锁的发生。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 银行家算法的数据结构
银行家算法依赖于几个关键数据结构来跟踪系统状态:
2.1 主要数据结构
-
Available向量:长度为m,表示每类资源的可用数量
- Available[j] = k:表示资源j有k个实例可用
-
Max矩阵:n×m矩阵,定义每个进程对每类资源的最大需求
- Max[i,j] = k:进程i最多需要k个资源j
-
Allocation矩阵:n×m矩阵,记录当前分配给每个进程的资源
- Allocation[i,j] = k:进程i当前持有k个资源j
-
Need矩阵:n×m矩阵,表示每个进程还需要的资源
- Need[i,j] = Max[i,j] - Allocation[i,j]
2.2 数据结构关系
这三个矩阵之间存在以下重要关系:
code复制Need[i,j] = Max[i,j] - Allocation[i,j]
这个关系是银行家算法能够正确工作的基础,确保进程不会请求超过其声明的最大资源量。
3. 银行家算法实现细节
3.1 安全性算法
安全性算法用于判断系统当前是否处于安全状态:
-
初始化:
- Work = Available(复制可用资源向量)
- Finish[i] = false(所有进程初始未完成)
-
查找可满足的进程:
- 找到Need[i] ≤ Work且Finish[i]==false的进程i
- 如果找到,假设其完成并释放资源:
- Work = Work + Allocation[i]
- Finish[i] = true
- 重复直到所有进程完成或找不到满足条件的进程
-
判断安全性:
- 如果所有Finish[i]==true,系统安全
- 否则,系统不安全
