银行家算法
银行家算法
一、算法思想:在进程请求资源之前
1、实际资源检测:
Request < Need
Request < Available
2、假分配检测:
假设进行分配,预测是否会产生死锁。
3、程序结构:
(Request > (Request >
Available -= Allocation[i] += Need[i] -=
(!
}
二、实例:参考这里
假设系统中有A、B、C三种资源,P1~P5共5个进程,某时刻三种资源数量Available =(3,3,2)。其他状态如下:
MAX(最多需要资源) | Allocation(已分配资源) | Need(还需资源) | |
P1 | 7 5 3 | 0 1 0 | 7 4 3 |
P2 | 2 0 0 | 1 2 2 | |
P3 | 9 0 2 | 3 0 2 | 6 0 0 |
P4 | 2 2 2 | 2 1 1 | 0 1 1 |
P5 | 4 3 3 | 0 0 2 | 4 3 1 |
某时刻P2发出请求向量Request =(1,0,2),根据银行家算法:
Request < Need (P2) 且 Request < Available;
假设预分配给P2,则得到如下状态:Available = (2,3,0)
MAX(最多需要资源) | Allocation(已分配资源) | Need(还需资源) | |
P1 | 7 5 3 | 0 1 0 | 7 4 3 |
P2 | 3 2 2 | 3 0 2 | 0 2 0 |
P3 | 9 0 2 | 3 0 2 | 6 0 0 |
P4 | 2 2 2 | 2 1 1 | 0 1 1 |
P5 | 4 3 3 | 0 0 2 | 4 3 1 |
此时根据isSafy()判断,先将Available分配给P2,P2执行结束后Available = (5,3,2);在分配给P4,执行结束后Available = (7,4,3);分配给P5,结束后Available = (7,4,5);分配给P1,结束后Available = (7,5,5);分配给P3,执行后Available = (10,5,7)。最后所有进程全部执行结束,不会死锁,isSafy为真,可以分配。
三、银行家算法C++实现:
#include<iostream>
numR,numP,*Max,*Allocation,*Need,*Available,*
banker( Max = ( *)malloc(()*numR* Allocation = ( *)malloc(()*numR* Need = ( *)malloc(()*numR* Available = ( *)malloc(()* Request = ( *)malloc(()* cin>>numR>> ( i=; i<numP; i++ ( j=; j<numR; j++ cin>>Max[i*numR + (i=; i<numP; i++ ( j=; j<numR; j++ cin>>Allocation[i*numR + Need[i*numR + j] = Max[i*numR + j] - Allocation[i*numR + (i=; i<numR; i++ cin>> ( cin>> ( i=; i<numR; i++ cin>> compare( *a, * ( i=; i<numR; i++ (a[i] < *flags = ( *)malloc(()* memset(flags,,()* num= (num<= (!flags[num]&&compare(Available, &Need[num* ( i=;i<numR;i++ Available[i] +=Allocation[num*numR+ flags[num] = num= } num++ ( i=; i<numP; i++ (! banker( (compare(Request,&Need[p* cout<<<< cout<<<< ( i=;i<numR;i++ Available[i] -= (i=;i<numR;i++ Need[i] -=