进程调度 RR 时间片轮转调度 java实现

本文介绍了时间片轮转调度策略,通过Java实现详细讲解了PCB类、RR类和Test类的结构及功能,以及如何进行系统调度。并通过不同时间片长度的实例展示了调度结果,分析了平均周转时间和平均带权周转时间。
摘要由CSDN通过智能技术生成

时间片轮转调度

时间片轮转调度策略:在轮转(RR)法中,系统将所有的就绪进程按FCFS策略排成一个就绪队列。系统可设置每隔一定时间(如30 ms)便产生一次中断,去激活进程调度程序进行调度,把CPU分配给队首进程,并令其执行一个时间片。当它运行完毕后,又把处理机分配给就绪队列中新的队首进程,也让它执行一个时间片。这样,就可以保证就绪队列中的所有进程在确定的时间段内,都能获得一个时间片的处理机时间。

数据结构和符号说明

本次的PCB类数据结构有三个公共变量,五个私有变量,一个标志变量,以及一个时时返回给调度函数值的交互式变量。

//三个公共变量:作业名、到达时间、服务时间
String threadName; int timeArrival; int timeSever;
//五个私有变量:计算专用服务时间、开始执行时间、完成时间、周转时间、带权周转时间
private int timeSeverFor; private int timeStart; private int timeComplete;
private int timeTurnaround; private double timeWeightedTurnaround;
//一个标志:表示是否还需要调度 一个交互式变量:表示自己本次使用了多少时间
private boolean isFinish = false; private int timeUse;

另有setter、getter函数实现私有变量的访问,同时有一个public boolean isNotStart() { return timeStart == 0; }函数根据进程的开始时间是否为0判断本程序是否启动过。在计算完成时间时,通过timeSever进行判断。每次时间片执行时都会时timeSever减去相应时间,此处的timeSever是时时更新的剩余服务时间,如果在一个时间片内提前结束了,则完成时间以及本次进程使用的时间都会进行调整,具体实现是通过三元运算符实现timeSever -= timeSlice; timeComplete = timeSever > 0 ? timeNow + timeSlice : timeNow + timeSlice + timeSever; timeUse = timeSever >= 0 ? timeSlice : timeSlice + timeSever;,而也只有在剩余服务时间<=0时即本进程已完成才会进行周转时间等计算。

RR类进行系统调度时,由主机记录时间,并按照个一个轮转片内进程实际使用的时间累加,调用时只需按照到达时间排序一次就好,随后便是各时间片轮转,使用一个while (countFinish < num)表示只要有一个进程未完成都会继续执行循环,而在while循环内部刚好是一个for each循环,各进程按照顺序一一轮转,如果进程未完成,则会调度此进程,完成就countFinish加1。调度时如果是第一次启动还需赋启动时间初值,随后运行本轮次pcb.run(timeNow, timeSlice),记录下这次实际使用的时间并累加到当前时间上。

测试类Test包含一个主函数用于启动并时间片长度q,以及一个专门用于接受输入进程信息的函数。并且输入的进程数组在测试类中定义,也能实现在RR类中的函数直接更改进程的信息。

流程图

在这里插入图片描述

源程序
PCB类
import java.text.DecimalFormat;

public class PCB {
   
    /**
     * 三个公共变量:作业名、到达时间、服务时间
     */
    String threadName;
    int timeArrival;
    int timeSever;

    /**
     * 五个私有变量:计算专用服务时间、开始执行时间、完成时间、周转时间、带权周转时间
     * 一个标志:表示是否还需要调度
     * 一个交互式变量:表示自己本次使用了多少时间
     */
    private int timeSeverFor;
    private int timeStart;
    private int timeComplete;
    private int timeTurnaround;
    private double timeWeightedTurnaround;
    private boolean isFinish = false;
    private int timeUse;

    public PCB() {
   //允许空参构造器存在
    }

    public PCB(String threadName, int timeArrival, int timeSever) {
    //正规的有参构造器
        this.threadName = threadName;
        this.timeArrival = timeArrival;
        this.timeSever = timeSever;
        this.timeSeverFor = timeSever;
    }

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SK Primin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值