C#的银行家算法的实现

给个赞是对我最好的肯定~
  1 using System;
  2 
  3 namespace 银行家算法
  4 {
  5     class MainClass
  6     {
  7         public class Banker {  
  8             static int[] available = new int[4];       //资源数  
  9             static int[,] max = new int[5,4];          //最大资源需求
 10             static int[,] allocation = new int[5,4];   //已经分配的资源
 11             static int[,] need = new int[5,4];         //还需要的资源
 12             static int[] request = new int[4];         //存放请求
 13               
 14             int thread;  //线程号  
 15 
 16             //初始化各类的值  
 17             public void getData(){  
 18                 Console.Write("请输入A,B,C,D四类资源的数目:");  
 19                 //输入A,B,C三类资源数量  
 20                 for(int i = 0; i < 4; i++){  
 21                     available [i] = int.Parse (Console.ReadLine ());  
 22                 }  
 23                 //输入进程对三类资源的最大需求  
 24                 for(int i = 0; i < 5; i++){  
 25                     Console.WriteLine("请输入进程" + i + "对A,B,C,D三类资源的最大需求");  
 26                     for(int j = 0; j < 4; j++){  
 27                         max [i,j] = int.Parse (Console.ReadLine ()); 
 28                     }  
 29                 }  
 30                 //输入进程分配的三类资源数  
 31                 for(int i = 0; i < 5; i++){  
 32                     Console.WriteLine("请输入进程" + i + "已分配的A,B,C,D三类资源数");  
 33                     for(int j = 0; j < 4; j++){  
 34                         allocation[i,j] = int.Parse (Console.ReadLine ());  
 35                     }  
 36                 }  
 37                 //计算进程还需要的三类资源数  
 38                 for(int i = 0; i < 5; i++){  
 39                     for(int j = 0; j < 4; j++){
 40                         need[i,j] = max[i,j] - allocation[i,j];  
 41                     }  
 42                 }  
 43                 //重新计算available  
 44                 for(int i = 0; i < 4; i++){  
 45                     for(int j = 0; j < 5; j++){  
 46                         available[i] -= allocation[j,i];  
 47                     }  
 48                 }  
 49             }
 50 
 51             //用户输入要申请资源的线程和申请的资源,并进行判断  
 52             public void getThread(){  
 53                 Console.WriteLine("请输入申请资源的线程");  
 54                 int thread = int.Parse(Console.ReadLine());     //线程  
 55                 if(thread < 0 || thread > 4){  
 56                     Console.WriteLine("该线程不存在,请重新输入");  
 57                     getThread();
 58                 }else{  
 59                     this.thread = thread;  
 60                     Console.WriteLine("请输入申请的资源(0-4)");  
 61                     for(int i = 0; i < 4; i++){  
 62                         request[i] = int.Parse(Console.ReadLine());  
 63                     }  
 64                     if(request[0] > need[thread,0] || request[1] > need[thread,1] || request[2] > need[thread,2] || request[3] > need[thread,3]){  
 65                         Console.WriteLine(thread+"线程申请的资源超出其需要的资源,请重新输入");  
 66                         getThread();  
 67                     }else{  
 68                         if(request[0] > available[0] || request[1] > available[1] || request[2] > available[2] || request[3] > available[3]){
 69                             Console.WriteLine(thread + "线程申请的资源大于系统资源,请重新输入");  
 70                             getThread();  
 71                         }  
 72                     }  
 73                     changeData(thread);  
 74                     if(check(thread)){  
 75                         getThread();  
 76                     }else{  
 77                         recoverData(thread);  
 78                         getThread();  
 79                     }  
 80 
 81                 }  
 82             }  
 83 
 84             //thread线程请求响应后,试探性分配资源  
 85             public void changeData(int thread){  
 86                 for(int i = 0; i < 4; i++){  
 87                     //重新调整系统资源数  
 88                     available[i] -= request[i];  
 89                     //计算各个线程拥有资源  
 90                     allocation[thread,i] += request[i];  
 91                     //重新计算需求  
 92                     need[thread,i] -= request[i];  
 93                 }         
 94             }
 95 
 96             //安全性检查为通过,分配失败时调用,恢复系统原状           
 97             public void recoverData(int thread){  
 98                 for(int i = 0; i < 4; i++){  
 99                     //重新调整系统资源数  
100                     available[i] += request[i];  
101                     //计算各个线程拥有资源  
102                     allocation[thread,i] -= request[i];  
103                     //重新计算需求  
104                     need[thread,i] += request[i];  
105                 }   
106             }  
107 
108             //对线程thread安全性检查  
109             public bool check(int thread){  
110                 bool[] finish = new bool[5];  
111                 int[] work = new int[4];  
112                 int[] queue = new int[5];   //由于存放安全队列  
113                 int k = 0;//安全队列下标  
114                 int j;  //要判断的线程  
115                 int i;  
116                 //是否分配的标志  
117                 for( i = 0; i < 5; i++)  
118                     finish[i] = false;  
119                 j = thread;  
120                 for(i = 0; i < 4; i++){  
121                     work[i] = available[i];  
122                 }  
123                 while(j < 5){  
124                     for( i = 0; i < 4; i++){    
125                         if(finish[j]){  
126                             j++;  
127                             break;  
128                         }else if(need[j,i] > work[i]){  
129                             //(need[j,i]+"*"+i+work[i]);  
130                             j++;  
131                             break;  
132                         }else if(i == 2){  
133                             for(int m = 0; m < 4; m++){  
134                                 work[m] += allocation[j,m];  
135                             }  
136                             finish[j] = true;  
137                             queue[k] = j;  
138                             k++;  
139                             j = 0;   //从最小线程再开始判断  
140                         }  
141                     }  
142                 }  
143                 //判断是否都属于安全状态  
144                 for(int p = 0; p < 5; p++){  
145                     if(finish[p] == false){  
146                         Console.WriteLine("系统不安全,资源申请失败");  
147                         return false;  
148                     }  
149                 }  
150                 Console.WriteLine("资源申请成功,安全队列为:");  
151                 for(int q = 0; q < 5; q++){  
152                     Console.WriteLine (queue [q]); 
153                 }   
154                 return true;  
155             }
156 
157             //输出need和available
158             public void showData(){
159                 Console.WriteLine("need");
160                 for(int i = 0; i < 5; i++){  
161                     for(int j = 0; j < 4; j++){  
162                         Console.WriteLine (need [i, j] + "     ");
163                     }  
164                 }  
165                 Console.WriteLine("available");  
166                 for(int j = 0; j < 4; j++){  
167                     Console.WriteLine(available[j] + "     ");  
168                 }  
169             }
170 
171             static void Main(string[] args) {  
172                 Banker bk = new Banker();  
173                 bk.getData();  
174                 bk.getThread();
175             }
176 
177         }
178 
179     }
180 }

 

posted @ 2017-12-13 15:04  养鼠的猫  阅读(689)  评论(0编辑  收藏  举报