时间片轮转调度
时间片轮转调度策略:在轮转(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;
}

本文介绍了时间片轮转调度策略,通过Java实现详细讲解了PCB类、RR类和Test类的结构及功能,以及如何进行系统调度。并通过不同时间片长度的实例展示了调度结果,分析了平均周转时间和平均带权周转时间。
最低0.47元/天 解锁文章
521

被折叠的 条评论
为什么被折叠?



