刚看完王道考研操作系统中的多级反馈调度算法,闲着没事就试着编了下"仿真程序",
注(为啥是非抢占式的呢?抢占式的太麻烦,编不出来[狗头保命])
以课程上的案例为例吧,
进程 | 到达时间 | 运行时间 |
P1 | 0 | 8 |
P2 | 1 | 4 |
P3 | 5 | 1 |
直接上代码
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
class PCB{
private int priority = 0;//初始优先级最高
private String id;
private int arriveTime;//到达时间
private int runTime;//运行时间
public PCB(String id,int arriveTime,int runTime) {
this.id = id;
this.arriveTime = arriveTime;
this.runTime = runTime;
}
public void run(int time) {
runTime -= time;
}
public String getId() {
return this.id;
}
public int getArriveTime(){
return this.arriveTime;
}
public int getRunTime() {
return this.runTime;
}
}
public class OStestdemo {
public static void main(String[] args) throws InterruptedException {
int[] timelices = {1,2,4};//时间片的大小
List <Queue<PCB>> PriorityQueue = new LinkedList<Queue<PCB>>();
for(int i = 0;i < timelices.length;i++) {
Queue<PCB> temp = new LinkedBlockingQueue<PCB>();
PriorityQueue.add(temp);
}
int[][] Time = {{0,8},{1,4},{5,1}};//{到达时间,运行时间}
Queue<PCB> proce = new LinkedBlockingQueue<PCB>();//用于存放还未到来的进程
for(int i=0;i < Time.length;i++) {
proce.add(new PCB("P"+i,Time[i][0],Time[i][1]));
}
int clock=0;
while(true) {
if(!proce.isEmpty()) {
if(proce.element().getArriveTime() <= clock) {//若队头元素到了
PCB temp =proce.remove();
PriorityQueue.get(0).add(temp);//插入第一优先级队列
System.out.println(temp.getId()+" 到了"+"此时的时刻为: "+clock);
}
}
for(int i=0;i < PriorityQueue.size();i++) {//找到优先级最高的那个进程
if(!PriorityQueue.get(i).isEmpty()) {
PCB runPro = PriorityQueue.get(i).remove();
System.out.println(runPro.getId()+" 正在执行"+"此时的时刻为: "+clock);
if(runPro.getRunTime() > timelices[i]) {
runPro.run(timelices[i]);
clock += timelices[i];
if(i != PriorityQueue.size()-1) {//未到最低优先级
PriorityQueue.get(i+1).add(runPro);
}else {
PriorityQueue.get(i).add(runPro);
}
Thread.sleep(1000);
}else {//该进程执行完毕
clock += runPro.getRunTime();
runPro.run(runPro.getRunTime());
System.out.println(runPro.getId()+" 执行完毕"+"此时的时刻为: "+clock);
}
break;
}
}
}
}
}
执行结果:
P0 到了此时的时刻为: 0
P0 正在执行此时的时刻为: 0
P1 到了此时的时刻为: 1
P1 正在执行此时的时刻为: 1
P0 正在执行此时的时刻为: 2
P1 正在执行此时的时刻为: 4
P2 到了此时的时刻为: 6
P2 正在执行此时的时刻为: 6
P2 执行完毕此时的时刻为: 7
P0 正在执行此时的时刻为: 7
P1 正在执行此时的时刻为: 11
P1 执行完毕此时的时刻为: 12
P0 正在执行此时的时刻为: 12
P0 执行完毕此时的时刻为: 13