package com.kaiping.AvoidDeadlock;
import java.util.Scanner;
public class Banker {
int ProcessNum; //进程数
int SourceNum; //资源类型数
int[] Available; //可利用资源向量
int[][] Max; //最大需求矩阵
int[][] Allocation; //分配矩阵
int[][] Need; //需求矩阵
public Banker(int pN, int sN){
ProcessNum = pN;
SourceNum = sN;
Available = new int[SourceNum];
Max = new int[ProcessNum][SourceNum];
Allocation = new int[ProcessNum][SourceNum];
Need = new int[ProcessNum][SourceNum];
}
public void Initilize(){//初始化方法
Scanner s = new Scanner(System.in);
System.out.println("==========初始化==========");
for(int i = 0; i < Max.length; i++){
System.out.print("请依次输入第" + i + "进程的各资源数:");
for(int j = 0; j < Max[i].length; j++){
Max[i][j] = s.nextInt();
}
}
for(int i=0;i<Allocation.length;i++){
System.out.print("请依次输入第" + i + "进程中已分配资源的数量:");
for(int j=0;j<Allocation[i].length;j++){
Allocation[i][j] = s.nextInt();
Need[i][j] = Max[i][j] - Allocation[i][j];
}
}
for(int i=0;i<Available.length;i++){
System.out.print("请输入系统中第" + i + "种资源的剩余量:");
Available[i] = s.nextInt();
}
System.out.println("==========初始化结果==========");
System.out.println(" MAX ALLOCATION NEED AVAILABLE");
for(int i = 0; i < ProcessNum; i++){
System.out.print("P" + i + ": ");
for(int j = 0; j < SourceNum; j++){
if(Max[i][j]>9){//如果是两位数,控制格式,在数字前少输出一个" "。
System.out.print(Max[i][j] + " ");
}else{
System.out.print(" " + Max[i][j] + " ");
}
}
System.out.print(" ");
for(int j = 0; j < SourceNum; j++){
if(Allocation[i][j]>9){
System.out.print(Allocation[i][j] + " ");
}else{
System.out.print(" " + Allocation[i][j] + " ");
}
}
System.out.print(" ");
for(int j = 0; j < SourceNum; j++){
if(Need[i][j]>9){
System.out.print(Need[i][j] + " ");
}else{
System.out.print(" " + Need[i][j] + " ");
}
}
if(i==0){
System.out.print(" ");
for(int j=0;j<SourceNum;j++){
if(Available[j]>9){
System.out.print(Available[j] + " ");
}else{
System.out.print(" " + Available[j] + " ");
}
}
}
System.out.println();
}
System.out.println("=====完成初始化=====");
System.out.println();
}
public void BakerAlgorithm(){//银行家算法具体实现
int[] Request= new int[SourceNum];
int number; //进程号
Scanner s=new Scanner(System.in);
int i; //循环计数器
System.out.print("请输入要申请资源的进程号:");
number = s.nextInt();
System.out.print("请输入请求向量:");
for(i=0; i<SourceNum; i++){
Request[i] = s.nextInt();
}
for(i=0; i<SourceNum; i++){
if(Request[i] > Need[number-1][i]){//所需资源数大于需求量
System.out.println("进程所要求分配的资源数已超过其宣布的最大值,系统不予分配!");
return;
}
if(Request[i] > Available[i]){//所需资源大于可利用资源
System.out.println("系统中无足够的资源满足进程的申请,系统不予分配!");
return;
}
}
for(i=0; i<SourceNum; i++){ //假设系统将申请资源数分配给该进程,对数据进行相关修改
Available[i] -= Request[i];
Need[number-1][i] -= Request[i];
Allocation[number-1][i] += Request[i];
}
SafeTest safetest = new SafeTest(this);
if(safetest.SafeTestAlgorithm()){//安全性检查结果为安全
System.out.println("系统可以为该进程分配资源!");
return;
}else
{
System.out.println("系统不为该进程分配资源!");
for(i=0; i<SourceNum; i++){ //系统不能为该进程分配资源,前面的假设作废,对数据进行相关修改
Available[i] += Request[i];
Need[number-1][i] += Request[i];
Allocation[number-1][i] -= Request[i];
}
return;
}
}
}
银行家避免死锁算法模拟实现Java版
5星 · 超过95%的资源 需积分: 10 140 浏览量
2010-05-17
21:45:14
上传
评论
收藏 11KB ZIP 举报
KPLives
- 粉丝: 39
- 资源: 9
最新资源
- 课程设计-python爬虫-爬取日报,爬取日报文章后存储到本地,附带源代码+课程设计报告
- 软件和信息技术服务行业投资与前景预测.pptx
- 课程设计-基于SpringBoot + Mybatis+python爬虫NBA球员数据爬取可视化+源代码+文档+sql+效果图
- 软件品质管理系列二项目策划规范.doc
- 基于TensorFlow+PyQt+GUI的酒店评论情感分析,支持分析本地数据文件和网络爬取数据分析+源代码+文档说明+安装教程
- 软件定义无线电中的模拟电路测试技术.pptx
- 软件开发协议(作为技术开发合同附件).doc
- 软件开发和咨询行业技术趋势分析.pptx
- 软件测试题详解及答案.doc
- 软件漏洞生命周期管理策略.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈