⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xcpl.java

📁 银行家算法 静态分配资源分配资源 时间有限 多多指教
💻 JAVA
字号:
package net.uusin.zc;

import java.util.StringTokenizer;

public class xcpl 
{
	  static int ProBase[][]={{5,2,2,2,1,0,3,1,2},{3,5,1,1,1,1,2,4,0},{7,2,3,3,2,2,4,0,1},{5,3,2,1,1,0,4,2,2}};
	  static int WaitQ[][]=new int[6][4];
	  static int[] Res={3,4,4};//系统可用资源{假设认为ABC三类}
	  static int[] Work= Res;//操作备份的可用资源
	  
	public static void main(String[] args) 
	{
		int PRT[]=	new int[10];
		int Ra,Rb,Rc;
		//StringBuffer Sourbuf=new StringBuffer(100);
		
		System.out.println( "**********模拟进程资源表*********"); 
		System.out.println( "------------------------------------------");
		System.out.println( "进程ID  Am  Bm  Cm  Aa  Ba  Cc  An  Bn  Cn  ");
		for(int i3=0;i3<=3;i3++)///测试输出进程可能执行次序
        { System.out.print( " "+"p"+(i3+1)+"  ");
	       for(int j3=0;j3<=8;j3++)
		    System.out.print( "   "+ProBase[i3][j3]);
	       System.out.println();
        }
		System.out.println( "------------------------------------------");
		System.out.println( "初始系统资源");
		System.out.println( "------------------");
		System.out.println( "   A类   B类   C类");
		for (int l=0;l<=2;l++)
		System.out.print("    "+Res[l]);
		System.out.println();
		System.out.println( "------------------");
		System.out.println( "请输入进程名称 和资源");
		StringTokenizer fenxi=new StringTokenizer(StrInput().toString());
		int pi=0;
		while(fenxi.hasMoreTokens())
		{
			String lsstr=fenxi.nextToken();
			PRT[pi]=Integer.valueOf(lsstr);	
			pi++;
		}
     /////////////////////////////////////////////
		WaitQ=LSpl(pl (PRT[0]));
		/*for(int i3=0;i3<=5;i3++)///测试输出进程可能执行次序
           {System.out.println(); 
   	       for(int j3=0;j3<=3;j3++)
   		    System.out.print( WaitQ[i3][j3]);    	 
           }*/
		CountP (WaitQ,PRT[1],PRT[2],PRT[3],PRT[0]);	
	}
	static void CountP (int[][] p,int A,int B,int C,int pc)//pc进程所要求资源 A B C p为进程执行顺序数组 abc最好为正好值
	{  int suc=0;
		if ((A<=Res[0])&&(B<=Res[1])&&(C<=Res[2])&&(A>=ProBase[pc-1][6])&&(B>=ProBase[pc-1][7])&&(C>=ProBase[pc-1][8]))
		{//开始进程的need资源修改
			ProBase[pc-1][6]= ProBase[pc-1][6]-A;
			ProBase[pc-1][7]= ProBase[pc-1][7]-B;
			ProBase[pc-1][8]= ProBase[pc-1][8]-C;
			////////////////////////
			ProBase[pc-1][3]= ProBase[pc-1][3]+A;
			ProBase[pc-1][4]= ProBase[pc-1][4]+B;
			ProBase[pc-1][5]= ProBase[pc-1][5]+C;
			
			//更改剩余资源列表
			
			Res[0]=Res[0]-A;
			Res[1]=Res[1]-B;
			Res[2]=Res[2]-C;
			/////////////////////////////
			//System.out.println("asdjasdajsd");
			//for (int l=0;l<=2;l++)
			//{System.out.println(Res[l]);}
			//备份更改
			////////////////////////////////
			//此进程运行完毕释放pc进程所有资源回归到work临时储备系统资源数组
			Res[0]=Res[0]+ProBase[pc-1][3];
			Res[1]=Res[1]+ProBase[pc-1][4];
			Res[2]=Res[2]+ProBase[pc-1][5];
			/////////////////////////////////////////
			/*System.out.println("第一次资源");测试用
			for (int l=0;l<=2;l++)
			{System.out.println(Res[l]);}*/
			//////////////////////////////////////////
			//选择使用那个进程序列	
		int flag;//进程序列成功标志
		int piw=0;
		 for (int iw=0;iw<=5;iw++)
		 {	 	//备份更改
			 Work= Res;
			 flag=1;
			 for (int jw=1;jw<=3;jw++)				 
			 { 
				 if ((ProBase[p[iw][jw]-1][6]<=Work[0])&&(ProBase[p[iw][jw]-1][6]<=Work[1])&&(ProBase[p[iw][jw]-1][6]<=Work[2]))
				 {
					 Work[0]=Work[0]-ProBase[p[iw][jw]-1][6];
					 Work[1]=Work[1]-ProBase[p[iw][jw]-1][7];
					 Work[2]=Work[2]-ProBase[p[iw][jw]-1][8];
					 //运行完毕释放资源
					 Work[0]=Work[0]+ProBase[p[iw][jw]-1][0];
					 Work[1]=Work[1]+ProBase[p[iw][jw]-1][1];
					 Work[2]=Work[2]+ProBase[p[iw][jw]-1][2];
					 //记录当前行号;
					 piw=iw;
				 
				 }
				 else
				 {flag=0;
					 continue;
				 }
			 }
			 if (flag==1)
			 {p[piw][0]=1;
				suc++; 
			 }
				 
		 } 
		}
		else
		{
			//bu 成功
			System.out.println("p"+pc+"进程:"+"  分配A类资源:"+A+"  分配B类资源:"+B+"  分配C类资源:"+C);
			System.out.println("分配不成功!测试系统处于不安全状态!");
		}
		if (suc>0)
		{
		System.out.println("共有"+suc+"种进程序列使测试系统处于安全状态,分别为:");
		for(int i3=0;i3<=5;i3++)
        {
        System.out.print(pc);
	       for(int j3=1;j3<=3;j3++)
	    	   if(p[i3][0]==1)
		    System.out.print( "-->"+p[i3][j3]); 
	       System.out.println(); 
        }
		}
	}
  ////////////////////////////////////////////////////////////////
      static int[] pl (int pi)//筛选进程
     {
    	  int pclist[]=new int[3];
          int k=1;
          int j=0;         
          for(int i=0;i<=2;i++)
         {	
             if (k!=pi)
            {
        	 pclist[j]=k;
        	 k++;
        	 j++;
        	 
            }
            else
            {
        	k++;
        	i--;
            }
         } 
         /*for(int i=0;i<=2;i++)
    	  System.out.println(pclist[i]);*/
        return pclist;
       }
      static int[][] LSpl (int pclist[] )//排列进程
      {
          //dest为预备系统进程触发排列顺序
          int dest[][]=new int[6][4]; //此排列表为假设一共有三个剩余进程则其排列方式为留种     
          /////////////////////////////////////////////
          int m=0;
          for (int li=0;li<=2;li++)
         	 for(int lj=0;lj<=2;lj++)
         		 for(int lk=0;lk<=2;lk++)
         			 if ((pclist[li]!=pclist[lj])&&(pclist[lj]!=pclist[lk])&&(pclist[li]!=pclist[lk]))
         			 { dest[m][1]=pclist[li]; 
         			 dest[m][2]=pclist[lj];          
         			 dest[m][3]=pclist[lk];
         			 m++;
         			 }
         			 else
         				 continue;    
          //第0列预备存放此序列是否运行成功标志
          ////////////////////////////////////////////
          
          return dest;
      }
      public static StringBuffer StrInput()//字符串输入方法 是讲单个字符输入到缓冲区域
  	
  	{	
  		char c;
  		StringBuffer buf=new StringBuffer(100);
  		try
  		{
  			while ((c=(char)System.in.read())!='\n')
  				buf.append(c);
  		}
  		catch(java.io.IOException e)
  		{System.out.println("字符输入有错误");}
  		return buf;
  		
  	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -