银行家算法

来源:互联网 发布:热血传奇闪避命中数据 编辑:程序博客网 时间:2024/06/10 00:07

操作系统上机实习课,简单地实现了一下银行家算法==具体的算法流程就不写了==

  1 #include<iostream>  2 #include<cstdio>  3 #include<cstring>  4 #include<string>  5 #include<algorithm>  6 using namespace std;  7 #define n 5//进程个数  8 #define m 3//资源种类  9 string safety; 10 int Available[m]={2,3,3};//可用资源向量 11 int Request[m];//进程请求向量 12 int Work[m]; 13 bool Finish[n]; 14 int Alloc[n][m]={ 15     {2,1,2}, 16     {4,0,2}, 17     {3,0,5}, 18     {2,0,4}, 19     {3,1,4}, 20 };//已分配资源数量 21 int Need[n][m]={ 22     {3,4,7}, 23     {1,3,4}, 24     {0,0,3}, 25     {2,2,1}, 26     {1,1,0}, 27 };//资源需求量 28  29 //判断是否合法 30 bool Is_legal(int index) 31 { 32     bool flag=true; 33     for(int i=0;i<m;i++){ 34         if(Request[i]>Available[i]||Request[i]>Need[index][i]){ 35             flag=false;break; 36         } 37     } 38     if(!flag)return false; 39     return true; 40 } 41  42 //试探性分配 43 void Change(int index) 44 { 45     for(int i=0;i<m;i++){ 46         Available[i]-=Request[i]; 47         Alloc[index][i]+=Request[i]; 48         Need[index][i]-=Request[i]; 49     } 50 } 51  52 //取消试探性分配 53 void Rechange(int index) 54 { 55     for(int i=0;i<m;i++){ 56         Available[i]+=Request[i]; 57         Alloc[index][i]-=Request[i]; 58         Need[index][i]+=Request[i]; 59     } 60 } 61  62 //安全性检查 63 bool Check(int index) 64 { 65     memset(Finish,false,sizeof(Finish)); 66     bool flag=true; 67     safety="";safety+=index+'0'; 68     for(int i=0;i<m;i++){ 69         Work[i]=Available[i]; 70         if(Work[i]<Need[index][i])flag=false; 71     } 72     if(!flag)return false; 73     for(int i=0;i<m;i++)Work[i]+=Alloc[index][i]; 74     Finish[index]=true; 75     for(int i=0;i<n;i++) 76     { 77         if(Finish[i]==false){ 78             flag=true; 79             for(int j=0;j<m;j++){ 80                 if(Work[j]<Need[i][j]){ flag=false;break; } 81             } 82             if(flag){ 83                 for(int j=0;j<m;j++){ 84                     Work[j]+=Alloc[i][j]; 85                 } 86                 safety+=i+'0'; 87                 Finish[i]=true; 88                 i=-1; 89             } 90         } 91     } 92     for(int i=0;i<n;i++){ 93         if(Finish[i]==false)return false; 94     } 95     return true; 96 } 97      98  99 int main()100 {101     int index;102     while(scanf("%d",&index),--index>=0&&index<n)103     {104         for(int i=0;i<m;i++)105             scanf("%d",&Request[i]);106         if(!Is_legal(index)){ puts("不合法");continue; }107         Change(index);108         if(Check(index))109         {110             for(int i=0;i<n;i++){111                 printf("%d ",safety[i]-'0'+1);112             }113             puts("");114         }else puts("安全性检查失败");115         Rechange(index);116     }117     return 0;118 }119 120 121 122 123         124         125 126         127         
View Code

 

0 0