国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 操作系統 > 正文

銀行家算法

2024-06-28 13:27:37
字體:
來源:轉載
供稿:網友
銀行家算法

一、算法思想:在進程請求資源之前

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(還需資源)
P17  5  3  0  1  07  4  3
P23  2  22  0  01  2  2
P39  0  23  0  26  0  0
P42  2  22  1  1  0  1  1
P54  3  30  0  24  3  1

  某時刻P2發出請求向量Request =(1,0,2),根據銀行家算法:

    Request < Need (P2) 且 Request < Available;

  假設預分配給P2,則得到如下狀態:Available = (2,3,0)

MAX(最多需要資源)Allocation(已分配資源)Need(還需資源)
P17  5  3  0  1  07  4  3
P23  2  23  0  20  2  0
P39  0  23  0  26  0  0
P42  2  22  1  1  0  1  1
P54  3  30  0  24  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 }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盐城市| 阿克苏市| 荥经县| 浦江县| 汝城县| 平武县| 清镇市| 新宾| 潮安县| 康定县| 克什克腾旗| 台中市| 榆社县| 新昌县| 东山县| 建水县| 成都市| 绍兴市| 马鞍山市| 自贡市| 年辖:市辖区| 随州市| 汪清县| 定日县| 友谊县| 宣威市| 宁晋县| 亳州市| 沙湾县| 肃宁县| 北流市| 苗栗县| 巩留县| 玉龙| 兴海县| 墨脱县| 长阳| 金乡县| 永康市| 呈贡县| 凤台县|