1. 银行家算法概述
银行家算法是操作系统中用于避免死锁的一种经典算法,由Edsger Dijkstra于1965年提出。这个算法最初是为银行系统设计的资金分配方案,后来被应用到操作系统的资源分配中。它的核心思想是通过预判资源分配是否会导致系统进入不安全状态,来决定是否批准当前资源请求。
在实际操作系统中,进程运行需要各种系统资源(如内存、I/O设备、文件句柄等)。当多个进程同时竞争有限资源时,就可能出现死锁情况——所有进程都在等待其他进程释放资源,导致系统无法继续运行。银行家算法通过模拟资源分配后的系统状态,确保系统始终保持在安全状态,从而避免死锁发生。
注意:银行家算法属于"死锁避免"策略,与"死锁预防"和"死锁检测与恢复"是三种不同的死锁处理方式。它最大的特点是能在资源分配前进行安全性检查。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法核心原理与数据结构
2.1 基本数据结构
银行家算法需要维护以下几个关键数据结构:
-
可用资源向量(Available):表示系统中每类资源当前可用的数量。例如,系统有3种资源,Available = [3, 2, 1]表示第一种资源剩3个,第二种剩2个,第三种剩1个。
-
最大需求矩阵(Max):表示每个进程对每类资源的最大需求量。如果有5个进程和3种资源,Max就是一个5×3的矩阵。
-
分配矩阵(Allocation):表示当前已分配给每个进程的各类资源数量,也是一个n×m矩阵(n个进程,m类资源)。
-
需求矩阵(Need):表示每个进程还需要的各类资源数量,可通过Need = Max - Allocation计算得到。
2.2 安全性算法
安全性算法是银行家算法的核心,用于判断系统是否处于安全状态。其步骤如下:
-
初始化Work = Available,Finish数组全为false。
-
寻找满足以下条件的进程i:
- Finish[i] == false
- Need[i] ≤ Work (即进程i所需的所有资源都小于等于当前可用资源)
-
如果找到这样的进程,假设它可以获得所需资源并运行完成,然后释放其占用的资源:
- Work = Work + Allocation[i]
- Finish[i] = true
