短作业优先(SJF)算法
SJF概念
以运行作业的时间长短来决定计算的优先级,作业运行时间越短,优先级越高。
SJF算法展示(java)
首先我们先来创建一个Process类来模拟作业
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;
//用于接收用户输入并赋值
public Process(String processName, int interTime, int workTime) {
ProcessName = processName;
InterTime = interTime;
WorkTime = workTime;
}
@Override
public String toString() {
return
"作业名:" + ProcessName +
" 到达时间:" + InterTime +
" 运行时间:" + WorkTime +
" 开始时间:" + StartTime +
" 完成时间:" + FinishTime +
" 周转时间:" + TurnTime +
" 带权周转时间:" + PowerTurnTime
;
}
}
这里我使用了lombk来自动创建有参无参方法(等同于手动生成),toString方法为了显示结果明显我重写了一下,这样作业类就创建完毕
问题分析&创建SJF算法
算法过程分析
-
当一组作业进入集合的时候,如果我们要采用SJF算法的时候需要根据他们的进入时间进行排序,无论第一个作业执行时间的长短,第一个到达的永远是被第一个执行的
-
当第一个被执行后我们就要选择出下一个被执行的作业
-
然后我们根据剩余作业的运行时间进行排序,获得运行时间最短的作业
-
当我们和获得了运行时间最短的作业后还需要对运行时间最短的作业进行判断,假定根据运行时间排序后的第一作业是我们要处理的作业,然后我们拿已将执行完的上一个作业的完成时间与当前作业的到达时间做比较,如果上一个作业的完成时间>=当前作业的到达时间,那这个假定是成立的,那这个作业就要被处理。
-
如果上一个作业的完成时间<当前作业的到达时间,就说明这个作业还没有到达,就算它的运行时间短,它没到达也不会被执行。假设不成立,继续找第下一个作业,直到找打符合的作业并处理它。
SJF算法
- 首先进行初始化,执行第一个作业
//进行初始化,在这个时候第一个作业无论时间长短都是第一个执行的
public static Map<String, List<Process>> initSJF(List<Process> list, List<Process> finishList) {
//根据进入时间对作业进行排序
list.sort(new Comparator<Process>() {
@Override
public int compare(Process p1, Process p2) {
int num = p1.getInterTime() - p2.getInterTime();
return num == 0 ? p1.getWorkTime() - p2.getWorkTime() : num;
}
});
//执行第一个作业
list.get(0).setStartTime(list.get(0).getInterTime());
list.get(0).setFinishTime(list.get(0).getStartTime() + list.get(0).getWorkTime());
list.get(0).setTurnTime(list.get(0).getFinishTime() - list.get(0).get