银行家算法

一、算法思想:在进程请求资源之前

1、实际资源检测:

  Request < Need

  Request < Available

2、假分配检测:

  假设进行分配,预测是否会产生死锁。

3、程序结构:

 1 if(Request > Need[i])    error;
 2 if(Request > Available)    sleep();
 3 //假设分配
 4 Available -= Request;
 5 Allocation[i] += Request;
 6 Need[i] -=Request;
 7 //检测分配后是否死锁
 8 if(!isSafe()) {
 9     //不分配,还原假设分配操作
10 }else
11     //分配

二、实例:参考这里

  假设系统中有A、B、C三种资源,P1~P5共5个进程,某时刻三种资源数量Available =(3,3,2)。其他状态如下:

  MAX(最多需要资源) Allocation(已分配资源) Need(还需资源)
P1 7  5  3   0  1  0 7  4  3
P2 3  2  2 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++实现:

 1 #include<iostream>
 2 using namespace std;
 3 int numR,numP,*Max,*Allocation,*Need,*Available,*Request;
 4 
 5 
 6 void banker(int p);
 7 int main(){
 8     Max = (int *)malloc(sizeof(int)*numR*numP);
 9     Allocation = (int *)malloc(sizeof(int)*numR*numP);
10     Need = (int *)malloc(sizeof(int)*numR*numP);
11     Available = (int *)malloc(sizeof(int)*numR);
12     Request = (int *)malloc(sizeof(int)*numR);
13     cin>>numR>>numP;
14     for(int i=0; i<numP; i++){
15         for(int j=0; j<numR; j++){
16             cin>>Max[i*numR + j];
17         }
18     }
19     for(i=0; i<numP; i++){
20         for(int j=0; j<numR; j++){
21             cin>>Allocation[i*numR + j];
22             Need[i*numR + j] = Max[i*numR + j] - Allocation[i*numR + j];
23         }
24     }
25     for(i=0; i<numR; i++)
26         cin>>Available[i];
27     while(1){
28         int p;
29         cin>>p;
30         for(int i=0; i<numR; i++){
31             cin>>Request[i];
32         }
33         banker(p);
34     }
35 }
36 bool compare(int *a,int *b){
37     for(int i=0; i<numR; i++){
38         if(a[i] < b[i]){
39             return false;
40         }
41     }
42     return true;
43 }
44 bool isSafy(){
45     int *flags = (int *)malloc(sizeof(int)*numP);
46     memset(flags,0,sizeof(int)*numP);
47     int num=0;
48     while(num<=numP){
49         if(!flags[num]&&compare(Available, &Need[num*numR])){
50             for(int i=0;i<numR;i++){
51                 Available[i] +=Allocation[num*numR+i];
52             }
53             flags[num] = 1;
54             num=0;
55         }else{
56             num++;
57         }
58     }
59     for(int i=0; i<numP; i++){
60         if(!flags[i])
61             return false;
62     }
63     return true;    
64 }
65 void banker(int p){
66     if(compare(Request,&Need[p*numR])){
67         cout<<"Error!"<<endl;
68         return;
69     }
70     if(compare(Request,Available)){
71         cout<<"Block!"<<endl;
72         return;
73     }
74     for(int i=0;i<numR;i++){
75         Available[i] -=Request[i];
76     }
77     for(i=0;i<numR;i++){
78         Need[i] -=Request[i];
79     }
80     for(i=0;i<numR;i++){
81         Allocation[i] +=Request[i];
82     }
83     if(isSafy()){
84         cout<<"可以分配!"<<endl;
85         return ;
86     }else{
87         cout<<"产生死锁!"<<endl;
88         for(int i=0;i<numR;i++){
89             Available[i] +=Request[i];
90         }
91         for(i=0;i<numR;i++){
92             Need[i] +=Request[i];
93         }
94         for(i=0;i<numR;i++){
95             Allocation[i] -=Request[i];
96         }
97     }
98 }

 

posted @ 2014-03-04 21:04  DwyaneTalk  阅读(587)  评论(0编辑  收藏  举报