进程调度中非抢占式的多级反馈调度算法

刚看完王道考研操作系统中的多级反馈调度算法,闲着没事就试着编了下"仿真程序",

注(为啥是非抢占式的呢?抢占式的太麻烦,编不出来[狗头保命])

以课程上的案例为例吧,

进程 到达时间 运行时间
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

发布了38 篇原创文章 · 获赞 4 · 访问量 2156

猜你喜欢

转载自blog.csdn.net/gw_9527/article/details/100623376
今日推荐