引言
银行家算法(Banker’s Algorithm)是由Dijkstra提出,基本思想是仿照银行发放贷款时采取的控制方式而设计的一种死锁避免的算法。
实现思路
当一个进程申请使用资源的时候,银行家算法通过先尝试分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配作废,让该进程继续等待。
数据结构
银行家算法定义了一系列的数据结构用来描述系统当前的状态,其中包括:
Available:系统的可用资源量
Max[i]:进程i对资源的最大需求量
Allocation[i]:进程i目前已经得到的资源数量
Need[i]:进程i还需要多少的资源量
Request[i]:进程i当次申请的资源数量
银行家算法的具体步骤
银行家算法的安全性检查
细心的同学可以发现,上节所展示的银行家算法涉及到了系统新状态的安全性检查,那么如何检查呢?且听我娓娓道来。
数据结构
同样的先定义相关的数据结构:
Work:存放了当前每种可用资源的数量,值是整型
Finish:记录每个进程是否接受过安全检查,值是布尔类型
安全检查的步骤
如上图所示,事实上,当所有的i都满足Finish[i]==true时,此时总能找到一个包含所有进程的安全序列{P1,P2,P0,…,Pn}。
银行家算法的应用
前面两节已经介绍了银行家算法的实现步骤以及安全检查的流程,最后以一个实例说明银行家算法是如何有效避免死锁的。
假设有如下的三个进程:
目前资源占有量 | 最大资源需求量 | 尚需要资源量 | |
---|---|---|---|
P1 | 1 | 4 | 3 |
P2 | 4 | 6 | 2 |
P3 | 5 | 8 | 3 |
假设系统资源剩余量为2,,可以看到,先把资源分配给P2,P2进程结束后释放资源,P1或P3继续执行就不会出现死锁,因此{P2,P1,P3}是一组安全序列。