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

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

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

以课程上的案例为例吧,

进程到达时间运行时间
P108
P214
P351

直接上代码

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值