📚 目录
1. 什么是银行家算法?
银行家算法(Banker's Algorithm)是由 Edsger Dijkstra 提出的一种死锁避免算法。它通过模拟资源分配过程,确保系统始终处于安全状态,从而避免死锁的发生。
核心思想:
-
🏦 银行家模型:将操作系统比作银行,资源比作资金
-
🔒 死锁避免:通过预判资源分配是否会导致死锁,决定是否分配资源
2. 银行家算法的核心概念
2.1 资源分配模型
银行家算法基于以下数据结构:
-
Available:可用资源向量
-
Max:每个进程的最大需求矩阵
-
Allocation:当前资源分配矩阵
-
Need:每个进程还需要的资源矩阵
公式: $$ Needi = Maxi - Allocationi $$
2.2 安全状态与安全序列
安全状态:系统能够找到一个进程执行序列,使得每个进程都能顺利完成。 安全序列:满足安全状态的进程执行顺序。
安全检查流程:
-
初始化 Work = Available,Finish = [false, false, ..., false]
-
查找 Need[i] ≤ Work 且 Finish[i] = false 的进程
-
假设该进程完成,释放资源:Work = Work + Allocation[i]
-
重复步骤2-3,直到所有进程完成或无法继续
3. 银行家算法的实现
3.1 算法流程
Syntax error in graphmermaid version 8.8.3
ERROR: [Mermaid] Parse error on line 7: ...请求]B -->|否| G[拒绝请求]<a name="32"></a> ----------------------^ Expecting 'SEMI', 'NEWLINE', 'SPACE', 'EOF', 'STYLE_SEPARATOR', 'START_LINK', 'LINK', got 'TAGSTART'
3.2 代码实现
def banker_algorithm(processes, available, max_need, allocation):
n = len(processes)
need = [[max_need[i][j] - allocation[i][j] for j in range(len(available))] for i in range(n)]
work = available.copy()
finish = [False] * n
safe_sequence = []
while True:
found = False
for i in range(n):
if not finish[i] and all(need[i][j] <= work[j] for j in range(len(work))):
work = [work[j] + allocation[i][j] for j in range(len(work))]
finish[i] = True
safe_sequence.append(processes[i])
found = True
if not found:
break
if all(finish):
print("系统安全,安全序列为:", safe_sequence)
else:
print("系统不安全,可能存在死锁")
4. 银行家算法的优缺点
优点:
-
有效避免死锁
-
适用于资源分配固定的系统
缺点:
-
需要预先知道最大资源需求
-
算法复杂度较高,不适合动态资源分配
5. 实际应用场景
-
操作系统资源管理:如内存、I/O设备分配
-
数据库事务管理:避免事务死锁
-
分布式系统:资源调度与分配
6. 面试常见问题
-
银行家算法的核心思想是什么?
-
通过预判资源分配是否会导致死锁,确保系统始终处于安全状态。
-
-
如何判断系统是否处于安全状态?
-
通过安全检查算法,寻找一个安全序列。
-
-
银行家算法的局限性是什么?
-
需要预先知道进程的最大资源需求,且算法复杂度较高。
-
-
银行家算法与死锁检测的区别?
-
银行家算法是死锁避免,死锁检测是死锁发生后进行处理。
-
1269

被折叠的 条评论
为什么被折叠?



