模拟进程调度时的优先数法和简单时间片轮转法,前者可以为进程设定以优先数PRIORITY为优先级,为了更好地并发,每次获得处理机后优先数减少3而重新选取。
在简单轮转法中则仅仅是一个普通队列,按照FIFO的方式出队获得处理机。
如果要使用比较器Comparator给优先级队列,在创建时就应作为参数传入进去。Comparator通过覆写返回int值的正负来做判断,常使用匿名内部类。
import java.util.Scanner;
//主类
public class Main {
static int proNUM=5;//进程数目
public static void main(String[] args) {
System.out.println("请输入priority(优先数法)或者RR(轮转法):");
//从键盘读入字符串
Scanner s=new Scanner(System.in);
String str=null;
str=s.next();
//比较
if(true==str.equals("priority"))//使用优先数法
new fun_priority();
else if(true==str.equals("RR"))//使用简单轮转法
new fun_myRR();
else//输的不对
System.out.println("错误的输入!再见!");
}
}
//进程控制块
class PCB {
int PID;//进程标识符
int PRIORITY;//进程优先级
int CPUTIME;//占用CPU时间片数
int ALLTIME;//还需时间片数
boolean STATE;//刚刚进程的状态(有无获得处理机)
//构造器(初始化)
PCB(int i){
PID=i;
//(数据类型)(最小值+Math.random()*(最大值-最小值+1))
PRIORITY=(int)(1+Math.random()*(60-1+1));
CPUTIME=0;
ALLTIME=(int)(1+Math.random()*(4-1+1));
STATE=false;//阻塞
}
}
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
//优先数法
class fun_priority {
static PCB[] pcb=null;//PCB数组
//有关PCB优先级,用下标i和j的匿名比较器
public static Comparator PriCmp = new Comparator(){
@Override
public int compare(Integer i, Integer j) {
return -(pcb[i].PRIORITY-pcb[j].PRIORITY);//这样优先级队列中是大的先出
}
};
//显示PCB数组的内容
void display(){
System.out.println("=================================================");
System.out.println("PID PRIORITY CPUTIME ALLTIME (Last Time)STATE");
for(int i=0;i" "+pcb[i].PRIORITY+" "+
pcb[i].CPUTIME+" "+pcb[i].ALLTIME+" "+pcb[i].STATE);
if(pcb[i].ALLTIME==0)
System.out.print(" 已死");
System.out.println("");
}
}
//优先数法的构造器
fun_priority(){
//分配数组空间
pcb=new PCB[Main.proNUM];
//创建空的优先级队列,指定使用PriCmp作为比较器
Queue myPriQ= new PriorityQueue(Main.proNUM,PriCmp);
//初始化PCB,同时把下标扔进优先级队列
for(int i=0;inew PCB(i);
myPriQ.add(new Integer(i));
}
display();//显示(初始情况)
Integer index;//临时用
//循环做优先数法
while(false==myPriQ.isEmpty()){
index=myPriQ.poll();//取一个
//优先级缩减
if(pcb[index].PRIORITY>3)
pcb[index].PRIORITY-=3;
else
pcb[index].PRIORITY=0;
//运行时间缩减,已执行时间增加
pcb[index].ALLTIME-=1;
pcb[index].CPUTIME+=1;
if(pcb[index].ALLTIME>0)//如果还没运行完
myPriQ.add(index);//再放回去
pcb[index].STATE=true;//先设为true
display();//显示(每次变化)
pcb[index].STATE=false;//显示完设回false
}
}
}
import java.util.LinkedList;
import java.util.Queue;
//简单轮转法
class fun_myRR {
static PCB[] pcb=null;//PCB数组
//显示PCB数组的内容
void display(){
System.out.println("===========================================================");
System.out.println("PID (无意义的)PRIORITY CPUTIME ALLTIME (Last Time)STATE");
for(int i=0;i" "+pcb[i].PRIORITY+" "+
pcb[i].CPUTIME+" "+pcb[i].ALLTIME+" "+pcb[i].STATE);
if(pcb[i].ALLTIME==0)
System.out.print(" 已死");
System.out.println("");
}
}
//构造器
fun_myRR(){
//分配数组空间
pcb=new PCB[Main.proNUM];
//创建空的队列(LinkedList类实现了Queue接口)
Queue myQ=new LinkedList();
//初始化PCB,同时把下标扔进队列
for(int i=0;inew PCB(i);
myQ.add(new Integer(i));
}
display();//显示(初始情况)
Integer index;//临时用
//循环做RR法
while(false==myQ.isEmpty()){
index=myQ.poll();//取一个
//运行时间缩减,已执行时间增加,这里时间片设为2
int k=pcb[index].ALLTIME>=2 ? 2 : 1;//这次用掉的时间片
pcb[index].ALLTIME-=k;
pcb[index].CPUTIME+=k;
if(pcb[index].ALLTIME>0)//如果还没运行完
myQ.add(index);//再放回去
pcb[index].STATE=true;//先设为true
display();//显示(每次变化)
pcb[index].STATE=false;//显示完设回false
}
}
}
请输入priority(优先数法)或者RR(轮转法):
priority
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 9 0 2 false
1 35 0 3 false
2 9 0 4 false
3 13 0 4 false
4 20 0 4 false
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 9 0 2 false
1 32 1 2 true
2 9 0 4 false
3 13 0 4 false
4 20 0 4 false
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 9 0 2 false
1 29 2 1 true
2 9 0 4 false
3 13 0 4 false
4 20 0 4 false
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 9 0 2 false
1 26 3 0 true 已死
2 9 0 4 false
3 13 0 4 false
4 20 0 4 false
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 9 0 2 false
1 26 3 0 false 已死
2 9 0 4 false
3 13 0 4 false
4 17 1 3 true
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 9 0 2 false
1 26 3 0 false 已死
2 9 0 4 false
3 13 0 4 false
4 14 2 2 true
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 9 0 2 false
1 26 3 0 false 已死
2 9 0 4 false
3 13 0 4 false
4 11 3 1 true
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 9 0 2 false
1 26 3 0 false 已死
2 9 0 4 false
3 10 1 3 true
4 11 3 1 false
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 9 0 2 false
1 26 3 0 false 已死
2 9 0 4 false
3 10 1 3 false
4 8 4 0 true 已死
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 9 0 2 false
1 26 3 0 false 已死
2 9 0 4 false
3 7 2 2 true
4 8 4 0 false 已死
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 9 0 2 false
1 26 3 0 false 已死
2 6 1 3 true
3 7 2 2 false
4 8 4 0 false 已死
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 6 1 1 true
1 26 3 0 false 已死
2 6 1 3 false
3 7 2 2 false
4 8 4 0 false 已死
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 6 1 1 false
1 26 3 0 false 已死
2 6 1 3 false
3 4 3 1 true
4 8 4 0 false 已死
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 3 2 0 true 已死
1 26 3 0 false 已死
2 6 1 3 false
3 4 3 1 false
4 8 4 0 false 已死
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 3 2 0 false 已死
1 26 3 0 false 已死
2 3 2 2 true
3 4 3 1 false
4 8 4 0 false 已死
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 3 2 0 false 已死
1 26 3 0 false 已死
2 3 2 2 false
3 1 4 0 true 已死
4 8 4 0 false 已死
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 3 2 0 false 已死
1 26 3 0 false 已死
2 0 3 1 true
3 1 4 0 false 已死
4 8 4 0 false 已死
=================================================
PID PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 3 2 0 false 已死
1 26 3 0 false 已死
2 0 4 0 true 已死
3 1 4 0 false 已死
4 8 4 0 false 已死
请输入priority(优先数法)或者RR(轮转法):
RR
===========================================================
PID (无意义的)PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 25 0 2 false
1 42 0 4 false
2 33 0 1 false
3 7 0 3 false
4 60 0 3 false
===========================================================
PID (无意义的)PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 25 2 0 true 已死
1 42 0 4 false
2 33 0 1 false
3 7 0 3 false
4 60 0 3 false
===========================================================
PID (无意义的)PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 25 2 0 false 已死
1 42 2 2 true
2 33 0 1 false
3 7 0 3 false
4 60 0 3 false
===========================================================
PID (无意义的)PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 25 2 0 false 已死
1 42 2 2 false
2 33 1 0 true 已死
3 7 0 3 false
4 60 0 3 false
===========================================================
PID (无意义的)PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 25 2 0 false 已死
1 42 2 2 false
2 33 1 0 false 已死
3 7 2 1 true
4 60 0 3 false
===========================================================
PID (无意义的)PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 25 2 0 false 已死
1 42 2 2 false
2 33 1 0 false 已死
3 7 2 1 false
4 60 2 1 true
===========================================================
PID (无意义的)PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 25 2 0 false 已死
1 42 4 0 true 已死
2 33 1 0 false 已死
3 7 2 1 false
4 60 2 1 false
===========================================================
PID (无意义的)PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 25 2 0 false 已死
1 42 4 0 false 已死
2 33 1 0 false 已死
3 7 3 0 true 已死
4 60 2 1 false
===========================================================
PID (无意义的)PRIORITY CPUTIME ALLTIME (Last Time)STATE
0 25 2 0 false 已死
1 42 4 0 false 已死
2 33 1 0 false 已死
3 7 3 0 false 已死
4 60 3 0 true 已死