这是第一次做的,不能重新申请资源,只能一次判断是否存在安全序列。
并且只能输出一种安全序列,即按进程数字最小的排。
暂时没有想到如果全部不满足分配应该如何退出死循环。
下面是代码:
public class Main {
public static void main(String[] args) {
//五个进程已经分配的资源
int[][] p_Allocation = new int[][]{{0,0,1,0},{1,2,2,0},{2,3,0,2},{2,2,1,1},{4,0,0,2}};
//每一行第一个元素是第几个进程
int[][] p_Need = new int[][]{{0,7,4,3},{1,1,2,2},{2,6,0,0},{3,0,1,1},{4,4,3,1}};
//第一个0空出来是为了方便计算,对齐
int[] Available = new int[]{0,3,3,2};
//双循环,判断是否有合适进程顺序存在
//judge是用来判断三类资源是否全部满足
//count是用来判断
int judge = 0,count = 0;
//从头遍历,标记组,如果已经释放的的,标记。以及所有的都释放的时候
System.out.println("满足系统要求的一个安全序列:");
//用i来作不停从头循环的条件。被释放的组标号改为-1
while(true){
int i = 0;
for(;i<5;i++){
judge = 0;
//从1开始是因为第0个代表第几个进程,因为存储需要,其实i是可以表示这是第几个进程的
for(int j = 1;j<4;j++){
if(p_Need[i][j]<=Available[j]&&p_Need[i][0] != -1){
judge++;
continue;
}else{
break;
}
}
if(judge==3){
System.out.println("p"+i);
count++;
p_Need[i][0] = -1;
for(int x = 1;x<4;x++){
//这里对need置-1是标志其进程已经被释放
// p_Need[i][x] = -1;
Available[x] = Available[x] +p_Allocation[i][x];
}
}
}
//这个判断是循环的出口
if(count==5){
break;
}
}
}
}
运行了下,出来的安全序列
p1
p3
p4
p0
p2
欢迎大家提意见……没做出来的部分要怎么修改