📄 xcpl.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 + -