由来与概述
- 该算法可以用于银行发放一笔贷款前,预测该笔贷款是否会引起银行资金周转问题。
- 银行的资金就类似于计算机系统的资源,贷款业务就类似于计算机的资源分配。银行家算法能预测一笔贷款业务对银行是否是安全的,该算法也能预测一次资源分配对计算机系统是否是安全的。
- 为实现银行家算法,系统中必须设置若干的数据结构。
数据结构
- 可利用资源向量Available:是一个具有m个元素的数组,其中每一个元素代表一类可利用资源的数目,其初始值为系统中该类资源的最大可用数目。其值将随着该类资源的分配与回收而荣泰改变。Available[j] = k,表示系统中现有Rj类资源k个;
- 最大需求矩阵Max:是一个n*m的矩阵,定义了系统中n个进程中的每一个进程对m类资源的最大需求。Max(i, j) = k,表示进程i对Rj类资源的最大需求个数为k个。
- 分配矩阵Allocation:是一个n*m的矩阵,定义了系统中每一类资源的数量。例如,Allocation(i,j) = k, 表示进程i当前对已分配Rj类资源的数目为k个。
- 需求矩阵Need:是一个n*m的矩阵,用以表示每一个进程尚需要的各类资源数目。例如,Need[i,j] = k,表示进程i还需要Rj类资源k个,方能完成其任务。
各类资源关系
Need[i, j] = Max[i ,j] - Allocation[i, j];
算法描述
安全性算法
- 设置两个工作向量:
- 设置一个数组Finish[n]。当Finish[i] = True( 0 <= i <= n, n为系统中进程数)时,表示进程Pi可以获得其所需的全部资源,而顺利执行完成。
- 同时需要设置一个临时变量Work,表示系统可提供给进程继续执行的资源集合。安全性算法刚开始执行时,Work := Available。
- 从进程集合中找到一个满足下列条件的进程:
Finish[i] = false; 并且 Need <= Work;
若找到满足该条件的进程,则执行步骤 3,否则执行步骤 4; - 当进程Pi获得资源后,将顺利执行直至完成,并释放其所拥有的全部资源,故应该执行:
Work := Work + Allcation;
Finish[i] := True;
GOTO 2; - 如果所有进程的 Finish[i] = True,则表示系统处于安全状态,否则系统处于不安全状态。
要求
- 对于每一个进程,我们都要声明它对每一类资源需求的总量;
- 进程之间相互独立,其执行顺序取决于系统安全,而非进程间的同步要求;
- 系统必须提供固定数量的资源供分配;
- 进程占用资源,则不能让其退出系统;