`
blogfeifei
  • 浏览: 1197543 次
文章分类
社区版块
存档分类
最新评论

Java实现银行家算法

 
阅读更多

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。

下面是用Java实现银行家算法的代码:

import java.util.Scanner;
public class Banker
{
int available[] = new int[]{3,3,2};//可得到的资源
int max[][] = new int[][]{{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};//每个进程最大资源数
int allocation[][] = new int[][]{{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//每个进程目前拥有的资源数
int need[][] = new int[][]{{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};//每个进程需要的资源数
void showData()//展示数据输出每个进程的相关数据
{
System.out.println("进程号 Max Allocation Need ");
System.out.println(" A B C A B C A B C");
for(int i = 0;i<5;i++)
{
System.out.print(i+" ");
for(int m = 0;m<3;m++) System.out.print(max[i][m]+" ");
for(int m = 0;m<3;m++) System.out.print(allocation[i][m]+" ");
for(int m = 0;m<3;m++) System.out.print(need[i][m]+" ");
System.out.println();
}
}

boolean change(int inRequestNum,int inRequest[])//分配数据
{
int requestNum = inRequestNum;
int request[] = inRequest;
// for(int i=0;i<3;i++)System.out.println("修改前available"+available[i]);
if(!(request[0]<=need[requestNum][0]&&request[1]<=need[requestNum][1]&&request[2]<=need[requestNum][2]))
{
System.out.println("请求的资源数超过了所需要的最大值,分配错误");
return false;
}
if((request[0]<=available[0]&&request[1]<=available[1]&&request[2]<=available[2])==false)
{
System.out.println("尚无足够资源分配,必须等待");
return false;
}

for(int i = 0;i<3;i++)//试分配数据给请求的线程
{
available[i] = available[i]-request[i];
allocation[requestNum][i] = allocation[requestNum][i] + request[i];
need[requestNum][i] = need[requestNum][i] - request[i];
}
// for(int i=0;i<3;i++)System.out.println("修改后available"+available[i]);
boolean flag = checkSafe(available[0],available[1],available[2]);//进行安全性检查并返回是否安全
// System.out.println("安全性检查后"+flag);
if(flag==true)
{
System.out.println("能够安全分配");
return true;
}
else//不能通过安全性检查 恢复到未分配前的数据
{
System.out.println("不能够安全分配");
for(int i = 0;i<3;i++)
{
available[i] = available[i]+request[i];
allocation[requestNum][i] = allocation[requestNum][i] - request[i];
need[requestNum][i] = need[requestNum][i] + request[i];
}
return false;
}
}
boolean checkSafe(int a,int b,int c)//安全性检查
{
int work[] = new int[3];
work[0] = a;
work[1] = b;
work[2] = c;
int i=0;
boolean finish[] = new boolean[5];
while(i<5)//寻找一个能够满足的认为完成后才去执行下一进程
{
if(finish[i]==false&&need[i][0]<=work[0]&&need[i][1]<=work[1]&&need[i][2]<=work[2])
{//找到满足的修改work值,然后i=0,重新从开始的为分配的中寻找
System.out.println("分配成功的是"+i);
for(int m = 0;m<3;m++)
work[m] =work[m] + allocation[i][m];
finish[i] = true;
i=0;
}
else//如果没有找到直接i++
i++;
}
for(i=0;i<5;i++)//通过finish数组判断是否都可以分配
{
if(finish[i]==false)
return false;
}
return true;
}
public static void main(String[] args)
{
Banker bank = new Banker();
bank.showData();
int request[] =new int[3];
int requestNum;
String source[] = new String[]{"A","B","C"};
Scanner s = new Scanner(System.in);
String choice = new String();
while(true)//循环进行分配
{
System.out.println("请输入要请求的进程号(0--4):");
requestNum = s.nextInt();
System.out.print("请输入请求的资源数目");
for(int i = 0;i<3;i++)
{
System.out.println(source[i]+"资源的数目:");
request[i] = s.nextInt();
}
bank.change(requestNum, request);
System.out.println("是否再请求分配(y/n)");
choice = s.next();
if(choice.equals("n"))
break;
}
}
}

水平有限,可能有些地方写的不太好。

分享到:
评论

相关推荐

    java实现银行家算法

    java实现银行家算法 java实现银行家算法

    java实现银行家算法代码

    用java实现银行家调度算法,避免进程死锁!

    java实现银行家算法(GUI界面)A+报告

    java实现银行家算法(GUI界面)A+报告

    基于java实现银行家算法的源码资料.zip

    银行家算法基于java实现银行家算法的源码资料.zip银行家算法基于java实现银行家算法的源码资料.zip银行家算法基于java实现银行家算法的源码资料.zip银行家算法基于java实现银行家算法的源码资料.zip银行家算法基于...

    基于 Java 实现银行家算法【100011124】

    本实验分为五个小实验,实验一的目的是模拟在单处理器环境下的处理器调度,加深了解处理器调度的工作。实验二的目的是理解在不同的存储管理方式下应怎样进行存储空间...实验五的目的是了解死锁的避免,掌握银行家算法。

    基于java实现银行家算法

    基于java实现银行家算法 基于java实现银行家算法 基于java实现银行家算法 基于java实现银行家算法 基于java实现银行家算法 基于java实现银行家算法

    java实现银行家算法(Swing界面)

    主要为大家详细介绍了银行家算法的java代码实现,Swing写的界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    java实现银行家算法.zip

    java实现银行家算法

    Java实现银行家算法和作业调度算法.zip

    自己学习的时候写的项目: Java实现银行家算法和作业调度算法

    java实现简单银行家算法

    主要为大家详细介绍了java实现简单银行家算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    银行家算法JAVA代码实现,附带图形化界面

    银行家算法JAVA代码实现,附带图形化界面,一般,就是希望给大家一个参考,申请的资源是随机的

    银行家算法java实现带UI界面(修正版)

    银行家算法java实现带UI界面(修正版:修改了由yu114提出的BankerMainUI.java与AddProcessDialog.java文件相同的问题) 以后大家发现类似问题的话,请大家知会一声,希望我们共同成长。

    银行家算法Java实现带图形界面

    图形界面银行家算法,设计有 n 个进程共享 m 个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和...

    使用java实现银行家算法

    主要为大家详细介绍了如何使用java实现银行家算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Java实现银行家算法课程实验报告

    这个实验报告可以帮助大家理顺如何理解银行家算法的原理和实现细节,以及如何在Java中实现这一算法的流程。通过阅读和分析这个实验报告,大家可以更好地理解并掌握银行家算法的核心思想和操作过程。欢迎大家下载使用...

Global site tag (gtag.js) - Google Analytics