操作系统处理机调度算法模拟实现

简介

  多道程序设计中,经常是若干个进程同时处于就绪状态,为了使系统中的各进程有条不紊地运行,必须选择某种调度策略,以选择一个进程占用处理机。

思路分析

  由于本实验是按照处理机调度算法模拟实现处理机的调度,与真正的处理机调度过程不完全相同,比如没有实现中断,进程的运行也不是真正的运行,而是在屏幕上打印其运行时间等。

大致思路:

  • 建立三个队列:PCB队列,就绪队列,完成队列。
    • PCB队列:保存将进入系统的进程。(由于没有实现中断,所以将进入系统运行的进程必须在程序运行前给出)。
    • 就绪队列:到达进程进入系统的时间,将该进程放入就绪队列,等待调度。
    • 完成队列:将“运行”完的进程放入完成队列。
  • 进程运行过程是在屏幕上打印相关信息。
    • 使用轮转算法调度的进程应打印的信息包括:进程占用处理机序列,该进程每次占用处理机的开始时间与结束时间。
  • 统计出进程的周转时间T和带权周转时间W。

大致流程图

这里写图片描述

实现

public class OSRR {
   
    public static void main(String[] args) {
        new RR();
    }
}

class RR {
    private Queue<RRBean> PCBQueue;
    private LinkedList<RRBean> ReadyQueue;
    private Queue<RRBean> CompleteQueue;
    // 定义时间片的长度
    private static final int SLICETIME = 4;
    // 定义总的运行时间
    private int time;

    RR() {
        time = 0;
        InitQueue();
        InitBean();
        StartProcess();
        showResult();
    }

    private void StartProcess() {
        System.out.println("PCB进程数" + PCBQueue.size());
        StringBuilder sb = new StringBuilder();
        sb.append("运行过程:");
        while (true) {
            // 是否所有进程运行完
            if (PCBQueue.size() == 0 && ReadyQueue.size() == 0) {
                // 如果所有进程都运行完了,就终止程序
                break;
            }
            // 是否有新的进程进入系统
            for (RRBean r : PCBQueue) {
                // 新的进程进入就绪队列
                if (r.arrive_time <= time) {
                    ReadyQueue.addFirst(r);
                    PCBQueue.remove(r);
                    break;
                }
            }

            // 就绪队列不为空的时候
            if (ReadyQueue.size() != 0) {
                // 取出一个进程运行
                RRBean r = ReadyQueue.poll();
                r.run_time += SLICETIME;
                int temp = time;
                // 如果时间片用完之后,
                if (r.run_time >= r.time) {
                    time += r.time - r.run_time + SLICETIME;
                    r.endTime = time;
                    // 该进程已经完成了
                    CompleteQueue.offer(r);
                } else {
                    time += SLICETIME;
                    // 该进程没有完成
                    ReadyQueue.offer(r);
                }
                System.out.println("进程号:" + r.id +
                        ",本次开始时间:" + temp + "
  • 9
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值