银行家算法是一个避免死锁产生的算法。
以银行借贷分配策略为基础,判断并保证系统处于安全状态。
- 客户在第一次申请贷款时,声明所需的最大资金量,在满足所有贷款需求并完成项目时,及时归还。
- 在客户贷款数量不超过银行拥有的最大值时,银行家尽量满足顾客的需求。
- 银行家---- 操作系统
- 资金------资源
- 客户----- 申请资源的线程
银行家算法— 数据结构 - Max(总需求量):n x m 矩阵
线程Ti 最多请求类型R j 的资源 Max【i,j】个实例。 - Available (剩余空闲量) : 长度为m的向量
当前有Available【i】个类型Rj的资源实例可用 - Allocation (已分配量) : n x m 矩阵
线程Ti 当前分配了 Allocation 【i,j】个Rj的实例 - Need(未来需求量 ): n x m 矩阵
线程Ti未来需要Need 【i,j】个Rj 资源实例
Need【i,j】=Max【i,j】-Allocation【i,j】
银行家算法: 安全状态判断
-
- Work Finish 分别是长度为m和n 的向量初始化:
Work =Available
Finish【i】= false for i: 1,2,…,n
- Work Finish 分别是长度为m和n 的向量初始化:
-
- 寻找线程Ti :
(a) Finish[i[= false //找出Need比Worl小的线程i
(b) Need[i] <= Work
没有找到满足条件的Ti ,转4
-
- Work =Work +Allocation[i](资源收回)
Finish[i] =true
转 2.
// 线程 i 的资源需求量小于当前剩余空闲资源量,所以配置给它再回收。
- Work =Work +Allocation[i](资源收回)
- 4 . 如所有线程 Ti 满足 Finish[i] == true, 则系统处于安全状态
// 所有线程的Finish为True 表明系统处于安全状态。
银行家算法 :
初始化: Requesti 线程 Ti 的资源请求量
Requesi[j] 线程Ti 请求资源Rj 的实例
循环:- 如果Requesti<= Need[i] , 转到步骤2. 否则,拒绝资源申请,因为线程已经超过了其最大要求。
- 如果Requesti < = Available ,转到步骤3. 否则, Ti 必须等待,因为资源不可用。
- 通过安全状态判断来确定是否分配资源给 Ti :
生成一个需要判断状态是否安全的分配环境
Avaliable = Avaliable - Request;
Allocation[i] = Allocation [i] +Request ;
Need[i] = Need [i] - Request;
调用安全状态判断:
如果返回结果安全,分配。
否则,拒绝。
- 寻找线程Ti :