一般化的银行家算法可以处理多种资源,下面首先用一个实例来描述一下该算法的处理过程,然后再给出这个算法的一般描述。
在该实例系统中,一共有4种资源:Tap Drivers、Plotters、Scanners、CD ROMs,其数量分别是:6、3、4、2;系统有五个进程:A、B、C、D、E来请求这四种资源。
Matrix C
Tap Drivers Plotters Scanners CD ROMs
A 3 0 1 1
B 0 1 0 0
C 1 1 1 0
D 1 1 0 1
E 0 0 0 0
图a 各个进程已经分配的资源
Matrix R
Tap Drivers Plotters Scanners CD ROMs
A 1 1 0 0
B 0 1 1 2
C 3 1 0 0
D 0 0 1 0
E 2 1 1 0
图b 各个进程仍然需要的资源
① 在矩阵R中,查看所有运行着的线程,看是否存在着向量Ri,使得Ri≤A;如果不存在这样的向量,那么系统中就没有进程可以完成,从而该系统最终将会死锁,算法中止;如果存在着一个或者多个Ri,算法执行第二步。
② 将该进程标记为“完成”状态,并将矩阵C中对应的向量Ci加到A上,即:A=A+Ci;
③ 重复步骤①和②,直至所有的线程标记为“完成”,那么这个状态是安全的;否则,若有线程没有标记为“完成”,则该状态为不安全状态。
现在回到上面的实例中,经过上述的算法判断,目前的状态是安全的。此后,如果进程B请求一个Scanners,那么如果满足这个请求的话会导致不安全状态,看下图所示。此时,进程D可以先运行完成,然后可以运行进程A,也可以运行E,接下来系统可用资源增多,系统可以顺序执行下去了。因此,这个进程B的此次资源请求是可以满足的。
Matrix C
Tap Drivers Plotters Scanners CD ROMs
A 3 0 1 1
B 0 1 1 0
C 1 1 1 0
D 1 1 0 1
E 0 0 0 0
图c 各个进程已经分配的资源
Matrix R
Tap Drivers Plotters Scanners CD ROMs
A 1 1 0 0
B 0 1 0 2
C 3 1 0 0
D 0 0 1 0
E 2 1 1 0
图d 各个进程仍然需要的资源
E=( 6 3 4 2 )
P=( 5 3 3 2)
A=( 1 0 1 0)
现在,我们再来看,当系统满足了进程B的资源请求之后,系统达到了上图中的a状态,此刻,如果进程E再请求一个Scanner,情况会怎么样呢,假设我们先满足他的请求,系统达到图5中的状态a。这样,A=(1000),那么就会使算法在第一步中止,从而导致系统死锁。因此,这次请求是不应该满足的,至少要推迟一段时间后再来满足之。
Matrix C
Tap Drivers Plotters Scanners CD ROMs
A 3 0 1 1
B 0 1 1 0
C 1 1 1 0
D 1 1 0 1
E 0 0 1 0
图e 各个进程已经分配的资源
Matrix R
Tap Drivers Plotters Scanners CD ROMs
A 1 1 0 0
B 0 1 0 2
C 3 1 0 0
D 0 0 1 0
E 2 1 0 0
图f 各个进程仍然需要的资源