银行家算法处理死锁避免

银行家算法处理死锁避免

  • 编写实现银行家算法,在算法执行过程中,首先判断申请资源的进程所申请的资源数目是否合法,若合法,则可以为其进行试分配,再利用安全性算法判断是否存在安全序列,若存在,则说明可以给申请资源的进程分配资源。否则,不进行资源的分配。

全局变量:

	boolean f=true;	//标记是否输入系统可用资源	
	private int tCounts;	//记录进程数
	private int rCounts;	//记录资源数
	private int[][] max;	// 最大需求矩阵,定义系统中进程对各类资源的最大需求数目
	private int[][] allocation ;   // 分配矩阵,定义已分配的资源数
	private int[][] need; 			// 需求矩阵,定义仍需求的资源
	private int[] available;		// 可利用资源向量

银行家算法:

public void bankerAlgo() {
		sc=new Scanner(System.in);
		
		if(f) {
			//定义系统各类资源可用量
			available=new int[rCounts];
			System.out.println("请输入当前时刻系统中各类可用资源数量");
			for(int i=0;i<rCounts;i++) {
				System.out.print("资源"+i+"可用数量:");
				available[i]=sc.nextInt();
			}
		}
		
		boolean check=checkSecurity();
		if(check) {					//判断是否存在安全序列
			f=true;
			System.out.print("请输入申请的进程号(0-"+(tCounts-1)+"):");
			int t=sc.nextInt();		//记录输入的进程
			if(t>=tCounts) {		//判断输入的进程号是否有效
				System.out.println("输入进程号无效,请重新输入!!!");
				f=false;
				bankerAlgo();
			}
			
			//存储申请的资源数。
			System.out.println("请输入该进程申请的各类资源量:");
			int[] request=new int[rCounts];	//存储申请的资源数
			for(int i=0;i<rCounts;i++) {
				System.out.print("资源"+i+":");
				request[i]=sc.nextInt();		//记录申请的资源数
				
				//判断进程请求资源是否小于仍需资源且小于系统资源可用量
				if(request[i]>need[t][i]||request[i]>available[i]) {
					System.out.println();
					if(request[i]>available[i]) {
						System.out.println("进程"+t+"资源"+i+"为"+request[i]+"大于系统可用资源"+available[i]);
					}else {
						System.out.println("进程"+t+"资源"+i+"为"+request[i]+"大于所需量"+need[t][i]+"");
					}
					System.out.println("申请不合法,请重新输入!!!");
					i=i-1;
				}
			}		
				//判断检验申请资源的正确数是否与资源数一致,一致尝试分配
				int[][] allocation2=new int[tCounts][];
				System.arraycopy(allocation, 0, allocation2, 0, allocation.length);
				int[][] need2=new int[tCounts][];
				System.arraycopy(need, 0, need2, 0, need.length);
				int[] available2=new int[rCounts];
				System.arraycopy(available, 0, available2, 0, available.length);
				
					for (int j=0;j<rCounts;j++) {
						allocation[t][j] += request[j];  
						need[t][j] -= request[j];
						available[j] -= request[j];	
					}
					System.out.println();
					System.out.println("------------打印试分配结构------------");
					
					boolean flag=checkSecurity();//判断是否存在安全序列
					if(flag) {
						initOutput();	//打印系统当前状态
						//打印各类资源可用数量
						System.out.println("各类资源可用数量(available):");
						for(int i=0;i<rCounts;i++) {
							System.out.print("资源"+i+"可用量:"+available[i]+"\t");
						}
						System.out.println();
						System.out.println("------------------------------------------");
						System.out.println();
						
					}else {
						available=available2;
						need=need2;
						allocation=allocation2;
					}
					
					//是否重新请求资源(按1继续,按0退出)
					System.out.print("是否重新请求资源(按1继续,按0退出):");
					int q=sc.nextInt();
					if(q==1) {
						bankerAlgo();
					}else {
						return;
					}
		}else {
			bankerAlgo();
		}
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值