import java.util.*;
public class TestBanker {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
TheBanker tb = new TheBanker();
tb.deadlockAvoidance();//死锁避免
//int gate = 1;
// while(gate!=0){
tb.deadlockDetection();//死锁检测
//}
}
}
class TheBanker{
int m;
int n;
int[][] max;
int[][] maxbak;
int[][] allocation;
int[][] allocationbak;
int[][] need;
int[][] needbak;
int[] available;
int[] availablebak;
public TheBanker(){
Scanner s = new Scanner(System.in);
System.out.print("请依次输入进程数和资源类型数:");
m = s.nextInt();
n = s.nextInt();
max =new int[m][n];
maxbak =new int[m][n];
allocation = new int[m][n];
allocationbak = new int[m][n];
need = new int[m][n];
needbak = new int[m][n];
available = new int[n];
availablebak = new int[n];
for(int i=0;i<max.length;i++){
System.out.print("请输入第" + i + "进程的MAX:");
for(int j=0;j<max[i].length;j++){
max[i][j] = s.nextInt();
maxbak[i][j] = max[i][j];
}
}
for(int i=0;i<allocation.length;i++){
System.out.print("请输入第" + i + "进程中的ALLOCTION:");
for(int j=0;j<allocation[i].length;j++){
allocation[i][j] = s.nextInt();
allocationbak[i][j] = allocation[i][j];
}
}
for(int i=0;i<need.length;i++){
for(int j=0;j<need[i].length;j++){
need[i][j] = max[i][j] - allocation[i][j];
needbak[i][j] = need[i][j];
}
}
System.out.print("请输入AVAILABLE:");
for(int i=0;i<n;i++){
available[i] = s.nextInt();
availablebak[i] = available[i];
}
System.out.println("初始化结果为下表:");
System.out.println(" MAX ALLOCATION NEED AVAILABLE");
for(int i=0;i<m;i++){
System.out.print("P" + i + ": ");
for(int j=0;j<n;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<n;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<n;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<n;j++){
if(available[j]>9){
System.out.print(available[j] + " ");
}else{
System.out.print(" " + available[j] + " ");
}
}
}
System.out.println();
}
System.out.println();
}
public void deadlockAvoidance(){
int[] security = new int[m];
boolean[] param = new boolean[m];
int[] tar = new int[n];
int count = 0;
int num1 = m+1;//计数器,每循环一遍所有进程就自减1
int num2 = m;//计数器,每遇到一个被满足的进程就自减1
while(num1>0){//如果num1==0,则说明依次循环下来没有能够满足的进程,因此中止
for(int i=0;i<m;i++){
if(param[i]==false){//只有没有被满足的进程才可以进入内层循环
param[i] = true;
for(int j=0;j<n;j++)
{
tar[j] = available[j] - need[i][j];
if(tar[j]<0){
param[i] = false;
}
}
if(param[i]==true){
for(int k=0;k<n;k++){
available[k] = available[k] + allocation[i][k];
}
security[count] = i;//记录以满足的进程号
count++;
num2--;
}
}
}
num1--;
while((num2==0)&&(num1>0)){
System.out.print("安全序量为:");
for(int i=0;i<m;i++){
if(i==(m-1)){
System.out.print("P" + security[i]);
}else{
System.out.print("P" + security[i] + "-->");
}
}
System.out.println();
System.out.println("结束");
System.out.println();
return;
}
while((num1==0)&&(num2>0)){
System.out.println("没有安全序列!");
System.out.println("结束");
System.out.println();
return;
}
}
}
public void deadlockDetection(){
Scanner sc = new Scanner(System.in);
int key;
int[] security = new int[m];
boolean[] param = new boolean[m];
int[] temp = new int[n];
int[] tar = new int[n];
int count = 0;
int num1 = m+1;//计数器,每循环一遍所有进程就自减1
int num2 = m;//计数器,每遇到一个被满足的进程就自减1
for(int i=0;i<m;i++){//回复死锁检测前的状态
for(int j=0;j<n;j++){
max[i][j] = maxbak[i][j];
allocation[i][j] = allocationbak[i][j];
need[i][j] = needbak[i][j];
available[j] = availablebak[j];
}
}
System.out.println();
//System.out.println("如果您此时想申请系统资源请输入进程号和"+n+"种资源量,系统将帮您判断是否可行。");
System.out.print("您输入的进程号为:");
key = sc.nextInt();
System.out.print("您要申请的第"+key+"种资源的数量为:");
for(int i=0;i<n;i++){
temp[i] = sc.nextInt();
}
for(int i=0;i<n;i++){
allocation[key][i] = allocation[key][i] + temp[i];
need[key][i] = need[key][i] - temp[i];
if(need[key][i]<0){
System.out.println("申请资源大于所需资源,系统不能分配资源!");
for(int k=0;k<m;k++){//回复死锁检测前的状态
for(int j=0;j<n;j++){
if(k==0){
available[j] = availablebak[j];
}
max[k][j] = maxbak[k][j];
allocation[k][j] = allocationbak[k][j];
need[k][j] = needbak[k][j];
}
}
return;
}
available[i] = available[i] - temp[i];
if(available[i]<0){
System.out.println("申请资源大于系统所剩资源,系统不能分配资源!");
for(int k=0;k<m;k++){//回复死锁检测前的状态
for(int j=0;j<n;j++){
if(k==0){
available[j] = availablebak[j];
}
max[k][j] = maxbak[k][j];
allocation[k][j] = allocationbak[k][j];
need[k][j] = needbak[k][j];
}
}
return;
}
}
System.out.println("申请资源时各进程的状态");
System.out.println(" MAX ALLOCATION NEED AVAILABLE");
for(int i=0;i<m;i++){
System.out.print("P" + i + ": ");
for(int j=0;j<n;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<n;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<n;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<n;j++){
if(available[j]>9){
System.out.print(available[j] + " ");
}else{
System.out.print(" " + available[j] + " ");
}
}
}
System.out.println();
}
System.out.println();
while(num1>0){//如果num1==0,则说明依次循环下来没有能够满足的进程,因此中止
for(int i=0;i<m;i++){
if(param[i]==false){//只有没有被满足的进程才可以进入内层循环
param[i] = true;
for(int j=0;j<n;j++){
tar[j] = available[j] - need[i][j];
if(tar[j]<0){
param[i] = false;
}
}
if(param[i]==true){
for(int k=0;k<n;k++){
java银行家算法源代码
需积分: 9 200 浏览量
2009-01-04
21:49:54
上传
评论 1
收藏 2KB RAR 举报
houcheng106
- 粉丝: 2
- 资源: 32