一、算法思想:在進程請求資源之前
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 }else11 //分配
二、實例:參考這里
假設系統中有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 }
新聞熱點
疑難解答