这个是南邮通达的操作系统实验,实验内容相对比较简单,就是实现一下银行家算法。

我没有参考任何源码,纯属 made by myself,如果差错,欢迎指出。

import java.util.*;
/**** @author 陆振宇* @version data:2019/11/10*/
/** 进程类* 继承Comparable是为了调用Collections.shuffle()方法* 以此来乱序进程类数组*/
class Process implements Comparable<Process>{int number;         // 进程序号int[] max;            // 最大数据int[] allocation;    // 最大需求矩阵int[] need;            // 需求矩阵boolean finish = false;public Process(int number, int[] max, int[] allocation) {this.number = number;this.max = max;this.allocation = allocation;this.need = BankerAlgorithm.arrayPlus(max, allocation);}public Process(){// 空构造方法,测试用}@Overridepublic int compareTo(Process process) {/** 如何和控制对象排序已经无关紧要* 转换思路为,利用将对象矩阵* 打乱多次(>1000次)来寻找安全序列*/// 以矩阵每位数字的差的总和控制排序/*int sum = 0;for (int i = 0 ; i < process.need.length ; i++){sum += BankerAlgorithm.arrayPlus(this.need,process.need)[i];}return sum;*/// 以need矩阵的差的第一位数字控制排序return  BankerAlgorithm.arrayPlus(this.need,process.need)[0];}
}
public class BankerAlgorithm {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);/*******************获取进程数************************/System.out.print("请输入系统中有几个进程:");int processNum = scanner.nextInt();                 // 进程数Process[] processes = new Process[processNum];      // 存放进程对象的数组/*******************获取资源************************/System.out.print("请输入系统中有几类资源:");int resourceNum = scanner.nextInt();int[][] allocation = new int[processNum][resourceNum];// 二维allocation数组int[][] max = new int[processNum][resourceNum];       // 二维max数组int[] request = new int[resourceNum];                 // request数组,存放Requestint[] available = new int[resourceNum];               // available数组,存放Request/*******************获取可利用资源向量Available************************/System.out.print("请输入系统的可利用资源向量Available:");scanner.nextLine();     // 控制格式String availableStr = scanner.nextLine();String[] availableSplit = availableStr.trim().split("\\s+|,");for (int i = 0 ; i < resourceNum ; i++){available[i] = Integer.parseInt(availableSplit[i]);}/**********获取每个进程的可用资源向量Allocation***********/for (int i = 1 ; i <= processNum ; i++){System.out.print("请输入第" + i + "个进程的分配矩阵Allocation:");/*if (i == 1){scanner.nextLine();                         // 控制输入格式,存疑}*/String allocationStr = scanner.nextLine();// 正则匹配空格或逗号,分隔字符串String[] allocationSplit = allocationStr.trim().split("\\s+|,");/*原思路是使用二维矩阵逐个赋值,较为繁琐,后修改for (int j = (i-1)*resourceNum ; j < i*resourceNum ; j++){allocation[j] = Integer.parseInt(allocationSplit[j%resourceNum]);}*/for (int j = 0 ; j < resourceNum ; j++){allocation[i-1][j] = Integer.parseInt(allocationSplit[j]);}}/****************获取每个进程的最大需求矩阵Max****************/for (int i = 1 ; i <= processNum ; i++){System.out.print("请输入第" + i + "个进程的最大需求矩阵Max:");/*if (i == 1){scanner.nextLine();                         // 控制输入格式,存疑}*/String maxStr = scanner.nextLine();String[] maxSplit = maxStr.trim().split("\\s|,");   //正则匹配空格或逗号,分隔字符串/*原思路是使用二维矩阵逐个赋值,较为繁琐,后修改for (int j = (i-1)*resourceNum ; j < i*resourceNum ; j++){max[j] = Integer.parseInt(maxSplit[j%resourceNum]);}*/for (int j = 0 ; j < resourceNum ; j++){max[i-1][j] = Integer.parseInt(maxSplit[j]);}}/*********************获取请求向量request****************/System.out.print("请输入向哪个进程发出请求:");int requestNum = scanner.nextInt();System.out.print("请输入进程" + requestNum + "的请求向量:");scanner.nextLine();String requestStr = scanner.nextLine();String[] requestSplit = requestStr.trim().split("\\s+|,");for (int i = 0 ; i < request.length ; i++){request[i] = Integer.parseInt(requestSplit[i]);  // 输入的请求向量存放到 request 数组中}/***************根据上面的输入创建进程*******************/for (int i = 0 ; i < processNum ; i++){processes[i] = new Process(i+1,max[i],allocation[i]);}/********************执行银行家算法**********************/bankerAlo(processes,available,request,requestNum-1);}/** 银行家算法* 系统向某个进程申请资源* 判断是否能分配给它*/public static void bankerAlo(Process[]processes,int[]available,int[]request,int n){System.out.println("\n判断初始时刻系统是否处于安全状态:");if (!safe(processes,available)){System.out.println("初始时刻系统不处于安全状态!");System.exit(0);}/***************防止进程对象的地址传递**************/Process processRequest = null;for (int i = 0 ; i < processes.length ; i++){if (processes[i].number == n){processRequest = processes[i];}}/**************************************************/System.out.print("通过银行家算法检测能否分配资源:");if (arrayCompare(request, processRequest.need)) {// request <= Need 则进行下一步,否则错误if (arrayCompare(request, available)) { // request <= availabl 则进行下一步,否则错误available = arrayPlus(available, request);      // available = available - request
// allocation = allocation + requestprocessRequest.allocation = arrayAdd(processRequest.allocation, request);
// need = need + requestprocessRequest.need = arrayPlus(processRequest.need, request);            } else {System.out.println("尚无足够资源,当前进程仍需等待。");System.exit(0); // 程序停止}} else {System.out.println("所需要的资源数已经超过了需要的最大值。");System.exit(0);     // 程序停止}System.out.println("资源分配完成,判断系统是否处于安全状态:");safe(processes,available);}/** 安全性算法* 如何寻找出一个安全序列?* 我的思路:通过将每个进程对象存在一个对象矩阵中,* 然后将对象矩阵打乱多次(>1000次),以此来寻找* 一个满足条件的安全序列* 注:安全序列并不唯一,找到一个即不再继续运行,* 但是如果不存在,那是必定找不到的。*/private static boolean safe(Process[] processes,int[] available) {/******************************************************/int n = processes[0].allocation.length;     // 资源个数int[] work = new int[n];for (int i = 0 ; i < n ; i++){work[i] = available[i];                 // Work = Available}// System.out.println("\nWork=Available=" + Arrays.toString(work));for (Process process : processes) {process.finish = false;                  // Finish = false}/* 测试用代码System.out.println("初始状态:");System.out.print("\nNeed:\t\t");for (int i = 0 ; i < processes.length ; i++){System.out.print(Arrays.toString(processes[i].need) + " ");}System.out.print("\nMax:\t\t");for (int i = 0 ; i < processes.length ; i++){System.out.print(Arrays.toString(processes[i].max) + " ");}System.out.print("\nAllocation:\t");for (int i = 0 ; i < processes.length ; i++){System.out.print(Arrays.toString(processes[i].allocation) + " ");}System.out.println();*//*************************寻找安全序列***********************/StringBuffer safeNumber = new StringBuffer();   // 可变字符串记录安全序列int count = 0;              // 循环次数int num = processes.length; // 进程个数5while (true){if (num == 0){System.out.println("存在安全序列{" + safeNumber + "},系统是安全状态。");break;}// 如果不存在安全序列,无论寻找多少次都不可能找到// 所以循环次数越大越精准,但时间复杂度会增大if (count > 10000){System.out.println("没有找到安全序列,系统不安全!");return false;}/***************乱序对象数组***********/ArrayList<Process> processList = new ArrayList<>();for (Process process1 : processes) {processList.add(process1);}// 原本的思路是正常排序,后改为乱序多次//Collections.sort(processList);/*for (Process process1 : processList) {System.out.println(Arrays.toString(process1.need));}*/Collections.shuffle(processList);   // 乱序int m = 0;for (Process process1 : processList) {processes[m] = process1;m++;}/***************************************/for (Process process : processes) {//Finish = false && need <= workif(process.finish == false && arrayCompare(process.need, work)){ work = arrayAdd(work, process.allocation);   // work = work + Allocationprocess.finish = true;if (num == 1){safeNumber.append(process.number);}else{safeNumber.append(process.number+", ");}num--;System.out.println("第" + (count+1) +  "次寻找安全序列:");System.out.println("安全序列:\t " + safeNumber);System.out.print("Need:\t\t");for (int i = 0 ; i < processes.length ; i++){System.out.print(Arrays.toString(processes[i].need) + " ");}System.out.print("\nMax:\t\t");for (int i = 0 ; i < processes.length ; i++){System.out.print(Arrays.toString(processes[i].max) + " ");}System.out.print("\nAllocation:\t");for (int i = 0 ; i < processes.length ; i++){System.out.print(Arrays.toString(processes[i].allocation) + " ");}System.out.println("\nWork:\t\t" + Arrays.toString(work));break;}}count++;}return true;}/** 矩阵相加运算,返回一个新的矩阵*/public static int[] arrayAdd(int[]a,int[]b){int n = a.length;int[] array = new int[n];for(int i = 0 ; i < array.length ; i++){array[i] = a[i] + b[i];}return array;}/** 矩阵相减运算,返回一个新的矩阵*/public static int[] arrayPlus(int[]a,int[]b){int n = a.length;int[] array = new int[n];for(int i =  0 ; i < array.length ; i++){array[i] = a[i] - b[i];}return array;}/** 矩阵比较* 矩阵A每一位都<矩阵B,则为 true* 否则为 false*/public static boolean arrayCompare(int[]a,int[]b){for(int i = 0 ; i < a.length ; i++){if(a[i] > b[i]){return false;}}return true;}
}

测试数据:

5
4
1 6 2 2
0 0 3 2
1 0 0 0
1 3 5 4
0 3 3 2
0 0 1 4
0 0 4 4
2 7 5 0
3 6 10 10
0 9 8 4
0 6 6 10
3
1 2 2 2


【南邮操作系统实验】银行家算法Java版相关推荐

  1. 【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPT)Java 版

    页面置换算法Java版 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 帮女朋友写了份 Python版的,Python版戳这里 帮女朋友舍友写了份 C++ 版的 ...

  2. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) C++ 版

    页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 写好了 Java 版和 Python 版的- Java版这里 Python版戳这里 帮女朋友舍友写 ...

  3. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) Python 版

    页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 本来已经写好一份 Java 版的了,然后又帮女朋友写了一份 Python 版,啊哈哈 Java版戳 ...

  4. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT)图形化界面(JavaFx)

    页面置换算法图形化界面 前言 运行效果 源码 FIFO LRU OPT FXML界面 控制器 启动类 前言 其实以前操作系统实验的时候我写过了三份了:(命令行) 页面置换算法 (FIFO.LRU.OP ...

  5. 计算机操作系统实验银行家算法,实验六 银行家算法(下)

    实验六 银行家算法(下) 一.实验说明 实验说明:本次实验主要是对银行家算法进行进一步的实践学习,掌握银行家算法的整体流程,理解程序测试时每一步的当前状态,能对当前的资源分配进行预判断. 二.实验要求 ...

  6. 操作系统实验——银行家算法

    文章目录 一.实验目的 二.实验内容和要求 三.实验原理 算法实现 四.实验程序 代码如下: 五.验证数据和运行结果 运行结果截图 六.思考与分析 附 一.实验目的 掌握银行家算法思想,并能编程实现. ...

  7. C++11 操作系统实验——银行家算法

    对,我又没事干,拿C++11写了个银行家算法的模拟程序. 使用了:OpenCV4.1 库来做显示(MFC太旧了,QT环境给我搞炸了...懒得弄了,选择OpenCV,虽然这个库是用来做机器视觉的...莫 ...

  8. 南邮 | 操作系统实验三:存储管理

    理解操作系统存储管理原理. 研读Linux 内存管理所用到的文件include/linux/mm.h,主要包括两个数据结构:mem_map.free_area. 在Linux 下,用malloc()函 ...

  9. 南邮操作系统实验之文件系统实验——实现简单多用户文本

    1.实验概述 实现多用户文件系统,每次用户可保存多个文件,一次运行用户可打开5个文件. 实现文件的相关操作,包括创建.删除.打开.关闭以及读写功能. 采用二级目录,设置主目录MFD.用户文件目录UFD ...

最新文章

  1. Excel向数据库插入数据和数据库向Excel导出数据
  2. 如何利用ArcGis把经纬度转成shp数据
  3. React Native——react-navigation的使用
  4. 微型数据中心正在向边缘发展
  5. 方法引用_通过类名引用静态成员方法
  6. 数据结构:用栈实现中缀表达式的求值(文字描述+详细步骤示例)
  7. java三板斧_Java 枚举使用三板斧
  8. Category 中属性的使用
  9. 解决python在pycharm中可以import本地文件,但命令行运行时报错:no model named xxxx本地文件
  10. 深入理解JVM(4)——对象内存的分配策略
  11. 《Scikit-Learn与TensorFlow机器学习实用指南》第7章 集成学习和随机森林
  12. 使用实体框架核心创建简单的审计跟踪
  13. 算法基本和常见排序算法
  14. 计算机毕业论文乐谱播放器,单片机音乐播放器毕业论文
  15. Android 测试
  16. 软件定义无线电的实时频谱分析仪相关原理介绍(二)——射频,中频和基带信号
  17. 变频器的工作原理与结构介绍
  18. 新知实验室-基于腾讯云音视频TRTC的微信小程序实践
  19. pyqt5 点击开始按钮,执行事件,中途点击暂停按钮后,所执行的事件暂停
  20. misc fiction 科幻小说中的五大鸡肋发明

热门文章

  1. 没人脉,没资源,没背景的人,最好的出路是什么?
  2. 一个女人如何让自已越来越厉害
  3. 为什么90%的人都抓不住暴富的机会?
  4. 华为智能手表WATCH GT2运动版和时尚版有什么区别?
  5. Dubbo关于timeout等相关配置的优先级
  6. SqlServer中 查询语句 case when 用法
  7. openwrt添加自己的iptables的targe编译报错
  8. 哈希分区和顺序分区_SQL Server中的哈希分区
  9. 如何解决SQL Server中SQL身份危机
  10. bzoj2595 [Wc2008]游览计划