博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
操作系统:Java模拟银行家算法
阅读量:3967 次
发布时间:2019-05-24

本文共 3985 字,大约阅读时间需要 13 分钟。


本人是个新手,写下博客用于自我复习、自我总结。

本人编写算法水平不高,可能会有错误,仅供各位参考。


1、系统可用资源=(5,3,8,2,10)

2、若干进程最大需求矩阵如下表所示:
在这里插入图片描述

import java.util.Scanner;public class Bank {
//用于判断数据输入是否有误 / 用于判断系统是否处于安全状态 public static boolean judge = true; //用于记录手动输入的 每个进程已经占有的资源 public static int request[][] = new int[6][5]; public static void main(String args[]) {
//记录每个资源的资源数 int available[] = {
5, 3, 8, 2, 10 }; //记录每个进程需要各个资源的资源数 int max[][] = {
{
3, 3, 5, 0, 5 }, {
5, 3, 8, 1, 2 }, {
2, 1, 2, 0, 4 }, {
4, 0, 7, 0, 5 }, {
1, 2, 3, 2, 5 }, {
3, 2, 6, 2, 9 } }; //记录每个进程已经拥有的各个资源的资源数 int allocation[][] = new int[6][5]; //记录每个进程还需要各个资源的资源数 int need[][] = {
{
3, 3, 5, 0, 5 }, {
5, 3, 8, 1, 2 }, {
2, 1, 2, 0, 4 }, {
4, 0, 7, 0, 5 }, {
1, 2, 3, 2, 5 }, {
3, 2, 6, 2, 9 } }; //记录系统中是否有足够资源分配给进程。false为没分配,true为已分配 boolean finish[] = {
false, false, false, false, false, false }; //手动输入每个进程已经占有的资源数 input(need, available, max); //只要输入阶段没出错,就进行算法部分 if (judge) {
bank(available, max, allocation, need, finish); } } //银行家算法 static void bank(int ava[], int max[][], int all[][], int need[][], boolean finish[]) {
//用于判断是否六个进程全部执行完毕 int count = 0; //用于记录进程下标 int i = 0; //用于记录进程的执行顺序 int arr[] = new int[6]; //用于记录arr数组的下标 int count2 = 0; //用于判断进程是否处于不安全状态 int count3 = 0; //不断循环,直到判断出系统处于安全状态/不安全状态 while (true) {
//只要count3变成了指定的数,就意味着变成了死循环,应立即跳出循环 if (count3 == 6) {
//设置false,证明系统处于不安全状态 judge = false; break; } //用于记录目前匹配成功的进程数 for (int a = 0; a < 6; a++) {
if (finish[a] == true) {
count += 1; } } //如果全部进程匹配成功,意味着系统处于安全状态,应立即跳出循环 if (count == 6) {
break; } else {
//只要该进程还没被匹配成功,就进行下述代码 if (finish[i] == false) {
System.out.println("现在执行第" + (i + 1) + "个进程:"); for (int j = 0; j < 5; j++) {
//只要进程需要每个资源的数目小于系统拥有的每个资源数 //就意味着能够把该资源分配给进程,就进行下述代码 //否则,证明该进程成功分配资源,需要立即跳出循环 if ((need[i][j] - request[i][j]) <= ava[j]) {
all[i][j] = all[i][j] + request[i][j]; need[i][j] = need[i][j] - request[i][j]; System.out.println("在分配后,它还需要" + (j + 1) + "资源" + need[i][j] + "个,系统还能提供" + ava[j] + "个"); ava[j] = ava[j] + all[i][j]; if (j == 4) {
System.out.println("该进程可以分配,满足条件,同时释放资源"); //证明该资源已经被分配成功 finish[i] = true; //用于记录执行顺序 arr[count2] = i; //改变下标 count2 += 1; //只要匹配成功,匹配失败的数量清零 count3 = 0; break; } } else {
System.out.println("该进程在获得第" + (j + 1) + "个资源时,系统只能提供" + ava[j] + "个,进程还需要" + (need[i][j] - request[i][j]) + "个,所以因为资源数量不足而出错"); //匹配失败的数量+1 count3 += 1; //如果匹配不成功的进程数已经等于还没被匹配的进程数 //也就意味着永远都无法匹配成功,即出现了死循环 if (count3 == 6 - count) {
count3 = 6; } break; } } //改变下标 i += 1; //如果循环到最后一个进程,就返回第一个进程 if (i == 6) {
i = 0; } //每次循环都要清零,用于重新判断是否每个进程都被成功分配 count = 0; } } } System.out.println("执行完毕"); //只要是安全状态: if (judge) {
System.out.println("资源分配后,系统处于安全状态。执行顺序是:"); for (int c = 0; c < 6; c++) {
System.out.print((arr[c] + 1) + " "); } } else {
//不安全状态 System.out.println("资源分配后,系统处于不安全状态,无法分配。"); } } //用于输入每个进程已经拥有的资源数 static void input(int need[][], int ava[], int max[][]) {
for (int i = 0; i < 6; i++) {
System.out.print("对于第" + (i + 1) + "个进程:"); System.out.println(); for (int j = 0; j < 5; j++) {
System.out.println("您已经占有" + (j + 1) + "资源多少个?"); Scanner sc = new Scanner(System.in); int contents = sc.nextInt(); //如果输入的资源数超过以下限定,那就证明输入数据有误,立即跳出循环 if (contents > need[i][j] && contents > ava[j] && contents > max[i][j]) {
System.out.println("输入数据有误,不满足当前条件"); judge = false; break; } else {
//否则满足输入条件,就进行记录 request[i][j] = contents; //同时分配成功后,需要减少原本资源数量 ava[j] = ava[j] - request[i][j]; } } //输入数据有误,跳出循环 if (!judge) {
break; } } }}

转载地址:http://ylyki.baihongyu.com/

你可能感兴趣的文章
P4-c++函数详解-04函数重载,函数模板和函数模板重载,编译器选择使用哪个函数版本?
查看>>
P5-c++内存模型和名称空间-01头文件相关
查看>>
P6-c++内存模型和名称空间-02存储连续性、作用域和链接性
查看>>
P9-c++对象和类-02构造函数和析构函数总结
查看>>
P10-c++对象和类-03this指针详细介绍,详细的例子演示
查看>>
Mule ESB-Content-Based Routing Tutorial(1)
查看>>
Mule ESB-Content-Based Routing Tutorial(2)
查看>>
Mule ESB-Content-Based Routing Tutorial(3)
查看>>
年末项目经验总结
查看>>
做事情要放下面子,拿起责任
查看>>
敏捷开发实践(1)-故事工作量估算导致的问题
查看>>
记一次解决jenkins持续构建,自动部署的问题
查看>>
敏捷开发实践(2)-要不要文档?
查看>>
写博意味着什么
查看>>
比较Cint() , int() , fix() ,round()的区别
查看>>
举例说明常用字符串处理函数
查看>>
软件生存期模型
查看>>
制定计划(问题的定义,可行性研究)
查看>>
需求分析
查看>>
软件设计
查看>>