Java操作系统进程调度算法------短作业优先调度算法(SJF)算法
一、算法思想
SJF(Shortest Job First)算法是一种作业调度算法,也称为最短作业优先算法,其思想是优先调度执行时间最短的作业。在SJF算法中,作业队列中所有作业的执行时间都已知,调度时选择执行时间最短的作业先执行,以保证平均等待时间最小。
二、算法分析
假设现在有五个进程先后到达系统进行调度
进程号 | 进程名 | 到达时间 | 服务时间(执行时间) |
---|---|---|---|
1001 | p1 | 9:40 | 20 |
1004 | p4 | 10:10 | 10 |
1005 | p5 | 10:05 | 30 |
1002 | p2 | 9:55 | 15 |
1003 | p3 | 9:45 | 25 |
在SJF算法中,由于在9:40时刻系统中只有作业p1,因比系统将优先为作业p1进行调度。作业p1在完成的过程中作业p2、p3、p4、p5先后都到达了系统中。也就是说在作业p1调度完成后系统中会有p2、p3、p4、p5四个作业等待调度。根据短进程调度优先的思想,
系统将依次按p2、p4、p3、p5的顺序为接下来的四个作业进行调度。
下述具体的计算可以参考本人FCFS算法的具体内容,此处不过多叙述(操作系统——FCFS算法(Java实现)-优快云博客)
周转时间 = 完成时间 - 到达时间
带权周转时间=周转时间/运行时间
等待时间=周转时间-运行时间(分钟)
平均周转时间
平均等待时间
三、数据结构
作业数据类
class ProcessData {
//进程号
public int id;
//进程名字
public String name;
//到达时间
public LocalTime arriveTime;
//执行时间
public double serviceTime;
//开始时间
public LocalTime startTime;
//完成时间
public LocalTime finishTime;
//周转时间
public double wholeTime;
//带权周转时间
public double weightWholeTime;
public ProcessData(int id, String name, String arriveTime, double serviceTime) {
this.id = id;
this.name = name;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("H:m");
this.arriveTime = LocalTime.parse(arriveTime,formatter);
this.serviceTime = serviceTime;
}
@Override
public String toString() {
DecimalFormat decimalFormat1 = new DecimalFormat("#");
DecimalFormat format = new DecimalFormat("#.00");
return id + "\t" +
name + "\t" + " " +
arriveTime + "\t" + " " +
decimalFormat1.format(serviceTime) + "\t" + " " +
startTime + "\t" + " " +
finishTime + "\t" + " " +
decimalFormat1.format(wholeTime) + "\t" + " " +
format.format(weightWholeTime);
}
}
作业调度(算法实现部分)
package cn.homyit;
import java.text.DecimalFormat;
import java.time.LocalTime;
import java.time.temporal