轮转法(时间片轮转法)
简介
在轮转算法中,系统根据先来先服务策略,将所有的就绪进程排成一个就绪队列。并可设置每隔一定的时间间隔即可产生一次中断,激活系统中的进程调度程序,完成一次调度,将CPU分配给队首的进程,令其执行。当该进程的时间片结束,或者该进程在时间片上提前结束,系统在将CPU分配给队首的进程。由此,可以保证就绪队列的所有进程在一个确定的时间片内,都能获得一次CPU执行
进程切换的情况
-
在一个时间片内,时间片用尽进程没有结束,这时就要把当前运行的进程放入就绪队列的队尾,就绪队列队首的进程获取到CPU并开始执行
-
在一个时间片内,进程提前结束,这时候此进程运行结束,并且就绪队列的第一进程获取到CPU开始执行。
时间片确定问题
时间片的确定对性能有很大的影响,比如时间片很小,就会出现进程上下文之间频繁切换很影响性能。如果时间片过大,轮转法就退化为了先来先服务算法。
代码演示
首先创建一个Process类来模拟进程,没有lombok包的手动生成getter setter和构造方法即可
package com.xu.demo.ytu;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Process {
//作业名
private String ProcessName;
//到达时间
private int InterTime;
//运行时间
private int WorkTime;
//开始时间
private int StartTime;
//完成时间
private int FinishTime;
//周转时间
private int TurnTime;
//带权周转时间
private float PowerTurnTime;
//时间标识判断是否在时间片上运行结束
private int TimeFlag;
//用于接收用户输入并赋值
public Process(String processName, int interTime, int workTime) {
ProcessName = processName;
InterTime = interTime;
WorkTime = workTime;
TimeFlag= workTime;
}
@Override
public String toString() {
return
"作业名:" + ProcessName +
" 到达时间:" + InterTime +
" 运行时间:" + WorkTime +
" 开始时间:" + StartTime +
" 完成时间:" + FinishTime +
" 周转时间:" + TurnTime +
" 带权周转时间:" + PowerTurnTime
;
}
}
论转算法核心部分代码(这里的时间片为1,可在修改timeSlice进行修改)
package com.xu.demo.ytu;
import java.util.*;
/**
* @Author XuJiAn
* @Time 2022/4/24
*/
public class RR {
/**
* 初始化操作
* @param list 原本的进程数据源程集合
* @param readyQueue 就绪队列
* @return map list与readyQueue结果集映射*
*/
public static Map<String, Object> initProcess(List<Process> list, Deque<Process