C#的银行家算法的实现
来源:互联网 发布:win7新增打印机usb端口 编辑:程序博客网 时间:2024/05/20 06:54
using System;namespace 银行家算法{class MainClass{public class Banker { static int[] available = new int[4]; //资源数 static int[,] max = new int[5,4]; //最大资源需求static int[,] allocation = new int[5,4]; //已经分配的资源static int[,] need = new int[5,4]; //还需要的资源static int[] request = new int[4]; //存放请求 int thread; //线程号 //初始化各类的值 public void getData(){ Console.Write("请输入A,B,C,D四类资源的数目:"); //输入A,B,C三类资源数量 for(int i = 0; i < 4; i++){ available [i] = int.Parse (Console.ReadLine ()); } //输入进程对三类资源的最大需求 for(int i = 0; i < 5; i++){ Console.WriteLine("请输入进程" + i + "对A,B,C,D三类资源的最大需求"); for(int j = 0; j < 4; j++){ max [i,j] = int.Parse (Console.ReadLine ()); } } //输入进程分配的三类资源数 for(int i = 0; i < 5; i++){ Console.WriteLine("请输入进程" + i + "已分配的A,B,C,D三类资源数"); for(int j = 0; j < 4; j++){ allocation[i,j] = int.Parse (Console.ReadLine ()); } } //计算进程还需要的三类资源数 for(int i = 0; i < 5; i++){ for(int j = 0; j < 4; j++){need[i,j] = max[i,j] - allocation[i,j]; } } //重新计算available for(int i = 0; i < 4; i++){ for(int j = 0; j < 5; j++){ available[i] -= allocation[j,i]; } } }//用户输入要申请资源的线程和申请的资源,并进行判断 public void getThread(){ Console.WriteLine("请输入申请资源的线程"); int thread = int.Parse(Console.ReadLine()); //线程 if(thread < 0 || thread > 4){ Console.WriteLine("该线程不存在,请重新输入"); getThread();}else{ this.thread = thread; Console.WriteLine("请输入申请的资源(0-4)"); for(int i = 0; i < 4; i++){ request[i] = int.Parse(Console.ReadLine()); } if(request[0] > need[thread,0] || request[1] > need[thread,1] || request[2] > need[thread,2] || request[3] > need[thread,3]){ Console.WriteLine(thread+"线程申请的资源超出其需要的资源,请重新输入"); getThread(); }else{ if(request[0] > available[0] || request[1] > available[1] || request[2] > available[2] || request[3] > available[3]){Console.WriteLine(thread + "线程申请的资源大于系统资源,请重新输入"); getThread(); } } changeData(thread); if(check(thread)){ getThread(); }else{ recoverData(thread); getThread(); } } } //thread线程请求响应后,试探性分配资源 public void changeData(int thread){ for(int i = 0; i < 4; i++){ //重新调整系统资源数 available[i] -= request[i]; //计算各个线程拥有资源 allocation[thread,i] += request[i]; //重新计算需求 need[thread,i] -= request[i]; } }//安全性检查为通过,分配失败时调用,恢复系统原状 public void recoverData(int thread){ for(int i = 0; i < 4; i++){ //重新调整系统资源数 available[i] += request[i]; //计算各个线程拥有资源 allocation[thread,i] -= request[i]; //重新计算需求 need[thread,i] += request[i]; } } //对线程thread安全性检查 public bool check(int thread){ bool[] finish = new bool[5]; int[] work = new int[4]; int[] queue = new int[5]; //由于存放安全队列 int k = 0;//安全队列下标 int j; //要判断的线程 int i; //是否分配的标志 for( i = 0; i < 5; i++) finish[i] = false; j = thread; for(i = 0; i < 4; i++){ work[i] = available[i]; } while(j < 5){ for( i = 0; i < 4; i++){ if(finish[j]){ j++; break; }else if(need[j,i] > work[i]){ //(need[j,i]+"*"+i+work[i]); j++; break; }else if(i == 2){ for(int m = 0; m < 4; m++){ work[m] += allocation[j,m]; } finish[j] = true; queue[k] = j; k++; j = 0; //从最小线程再开始判断 } } } //判断是否都属于安全状态 for(int p = 0; p < 5; p++){ if(finish[p] == false){ Console.WriteLine("系统不安全,资源申请失败"); return false; } } Console.WriteLine("资源申请成功,安全队列为:"); for(int q = 0; q < 5; q++){ Console.WriteLine (queue [q]); } return true; }//输出need和availablepublic void showData(){Console.WriteLine("need");for(int i = 0; i < 5; i++){ for(int j = 0; j < 4; j++){ Console.WriteLine (need [i, j] + " ");} } Console.WriteLine("available"); for(int j = 0; j < 4; j++){ Console.WriteLine(available[j] + " "); } }static void Main(string[] args) { Banker bk = new Banker(); bk.getData(); bk.getThread();}}}}
阅读全文
0 0
- C#的银行家算法的实现
- 银行家算法的实现
- 银行家算法的实现
- 银行家算法的模拟实现
- 银行家算法的C实现
- 银行家算法的C++实现
- 银行家算法的简单实现
- C_银行家算法的实现
- [C#]银行家算法的实现
- 对银行家算法的一种实现
- 银行家算法的C语言实现
- 银行家算法的java编程实现
- 关于银行家算法的模拟实现
- 银行家算法的数组方式实现
- 银行家算法的Python简单实现
- 别人的银行家算法
- 银行家算法的模拟
- 银行家算法的实现,有关进程资源分配的算法
- Visual Studio 2017 免费版提示strcpy()函数问题
- 客户端接收服务端消息推送sockjs-client的使用
- 调戏木马病毒的正确姿势-基础篇
- 点击页面上的一个按钮时,如何触发controller中的方法
- date对象常用方法
- C#的银行家算法的实现
- SpannableStringBuilder导致ellipsize失效(两者冲突)
- 移动端根据屏幕大小自动设置body字体大小
- 动态规划之零件加工
- 小学生开始学Python,还有什么能够阻挡我对Python的向往?
- 舒服的判断当前应用是否处于前台
- Golang从入门到精通(十四):Golang结构体
- 数组 链表 哈希表
- 数据结构实验之查找三:树的种类统计