1. 背景
在银行系统中, 客户完成项目需要申请贷款的数量是有限的, 每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量, 在满足所有贷款要求并完成项目时, 客户应及时归还. 银行家在客户申请的贷款数量不超过自己拥有的最大值时, 都应尽量满足客户的需要. 在这样的描述中, 银行家就好比操作系统, 资金就是资源, 客户就相当与要申请资源的进程.
2. 原理
当有一个进程请求各种资源时, 银行家算法会根据当前系统情况给你返回一个如果分配给你的话系统处于safe还是unsafe的结果, 如果返回safe, 那么就会分配给你, 如果返回unsafe, 那么请求进程就需要等待.
2.1 前提条件
- 多个实例
- 每个进程都必须能最大限度地利用资源
- 当一个进程请求一个资源, 就不得不等待
- 当一个进程获得所有的资源就必须在一段有限的时间释放它们
基于上述前提条件, 银行家算法通过尝试寻找允许每个进程获得的最大资源并结束(把资源返还给系统)的进程请求的一个理想执行时序, 来决定一个状态是否是安全的.
不存在这满足要求的执行时序的状态都是不安全的.
2.2 数据结构
- : 进程数量
- : 资源类型数量
- (总需求量): 矩阵. 如果, 表示进程最多请求资源类型的个实例.
- (剩余空闲量): 长度为的向量. 如果, 有个类型的资源实例可用.
- (已分配量): 矩阵. 如果, 则当前分配了个类型的资源实例.
- (未来需要量): 矩阵. 如果, 则可能需要至少个类型的资源实例完成任务.
2.3 判断过程
1. 定义和分别是长度为和的向量.
初始化:
- = //当前资源剩余空闲量
- //代表当前线程是否结束, 初始化均为false
2. 找这样的进程: //接下来找出 比小的进程
需要找到具有以下特点的进程:
- //这个线程结束所需要的所有资源都能被满足
如果找到了, 就跳到3, 如果没有找到这样的进程, 转到4.
3. 找到了当前能被满足的进程, 就执行并回收
- ; //回收进程执行结束后所分配的资源
- //所以配置给他再回收
转到2.
4. 因为4是由2转过来的, 到达了4, 就会出现两种情况
- if for all , then the system is in a safe state. //如果所有进程的, 那么表明系统处于安全状态, 那么银行家判断算法就会返回safe.
- 否则就是第二种状态, 找不到一个系统当前能直接结束的进程了
2.4 算法执行过程
1. 如果 , 转到步骤2. 否则, 提出错误条件, 因为进程已经超过了其最大要求.
2. 如果, 转到步骤3. 否则必须等待, 因为资源不可用.
3. 假装给分配给它需要的资源; //生成一个需要判断状态是否安全的资源分配环境:
Call safety state Estimating Algorithm:
- 如果返回sage, 将资源分配给.
- 如果返回unsafe, 必须等待, 旧的资源分配状态被恢复.
2.5 举例说明
- safe state:
初始状态如图:
1. 首先先确定有没有进程其, 找到了, 然后把其finish置为true, 然后把其占用的资源回收(资源分配向量加回到中):
2. 然后又找到了, 发现可以被满足, 重复上面步骤, 如下:
3. 然后又找到了, 发现可以被满足, 重复上面步骤, 如下:
4. 最后也可以被满足, 于是我们就找到了一个安全序列, , 那么此时的system state就是一个safe state.
- unsafe state:
初始状态如图:
1. 假如此时发出为[1, 0, 1], 系统会假设先分配给, 那么此时的状态变成了:
2. 然后此时发现系统已经找不到一个可以被满足的线程了, 所以此时银行家算法返回unsafe, 也就不会给线程分配资源.