银行家算法主要用于解决死锁问题,是一种基于静态资源分配的死锁检测方法。
首先,我们为资源定义出三种状态:
- 已被进程占用
- 进程资源需求最大值
- 系统可用资源
易见,(1)+(3)=系统资源总和
银行家算法就是通过枚举,验证能否通过手头上的可用资源,逐次满足各进程需要,并释放其占用资源,最终
实现所有进程的运行需要。
下面通过矩阵演示算法运行过程:
假设在某一状态,有
进程 最大需求内存 需求打印机
|
已占用内存 已占用打印机
A
100
1
|
80
0
B
200
0
|
50
0
可用资源:
内存 打印机
150 1
可见,A的需求能够满足。假设A能顺利运行并结束,则A释放所占用资源,此时矩阵化为:
进程 最大需求内存 需求打印机
|
已占用内存 已占用打印机
A
100
1
|
80
0
B
200
0
|
50
0
可用资源:
内存 打印机
230 1
此时,B进程的需求也得到满足,所有进程最后均顺利结束。我们称这种状态为安全状态(safe state)。反之,
则称为不安全状态(unsafe state)。不安全状态只是找不到一种合适的顺序,可以在使用已有资源的情况下逐次满足
*所有*进程的运行需要,但不一定导致死锁。下面假设两种情况:
- 有A、B两进程,当前可用资源无法满足任一进程的需要,但A在运行时暂时释放了所占用的资源,使得B得以结束,从而释放更多资源,使得A顺利结束。
- 有A、B、C三个进程,当前资源可以满足A的运行需要,因此此时A并没有陷入死锁。
因此,安全状态保证了一定不会发生死锁,而不安全状态没有这个保证,仅此而已。在实际应用当中,往往不能预知进程所需的资源最大值,且资源的可用性
容易改变(例如打印机卡纸了),所以应用不广。
相关链接:
死锁:
http://en.wikipedia.org/wiki/Deadlock
银行家算法(英文):
http://en.wikipedia.org/wiki/Banker%27s_algorithm