1.作业和作业调度
概念:作业是用户提交给系统的一项相对独立的工作。操作员把用户提交的作业通过相应的输入设备输入到磁盘存储器,并保存在一个后备作业队列中。再由作业调度程序将其从外存调入内存。
2.先来先服务(FCFS)调度算法
解释:系统按照作业来的时间去处理作业。
3.作业的状态
到达时间:作业到达的时间
开始时间:开始处理作业的时间
服务时间:处理该作业需要的时间
完成时间:作业处理完成的时间
周转时间:作业从进入到完成所消耗的时间
带权周转时间:作业的 周转时间 与它的 服务时间 之比
4.举个栗子
名字 | 到达时间 | 开始时间 | 服务时间 | 完成时间 | 周转时间 | 带权周转时间 |
---|---|---|---|---|---|---|
A | 1 | 1 | 2 | 3 | 2 | 1 |
B | 2 | 3 | 3 | 6 | 4 | 1.33 |
C | 4 | 6 | 4 | 10 | 6 | 1.5 |
完成时间 = 开始时间 + 服务时间
周转时间 = 完成时间 - 到达时间
带权周转时间 = 周转时间 / 服务时间
5模拟实现
先输入一个数n,表示共有那个作业,在接下来的n行输入中,每行包含三个数据:作业名、到达时间、服务时间。输出中 W:等待状态,F:完成状态。
作业类(Mission):
public class Mission implements Comparable<Mission> {
String name;
int ArrivalTime; //到达时间
int ServiceTime; //服务时间
int StartingTime; //开始时间
int FinishingTime; //完成时间
int TurnAroundTime; //周转时间
double WeightTurnAroundTime; //带权周转时间
String ServiceStatus; //运行状态
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getArrivalTime() {
return ArrivalTime;
}
public void setArrivalTime(int arrivalTime) {
ArrivalTime = arrivalTime;
}
public int getServiceTime() {
return ServiceTime;
}
public void setServiceTime(int serviceTime) {
ServiceTime = serviceTime;
}
public int getStartingTime() {
return StartingTime;
}
public void setStartingTime(int startingTime) {
StartingTime = startingTime;
}
public int getFinishingTime() {
return FinishingTime;
}
public void setFinishingTime(int finishingTime) {
FinishingTime = finishingTime;
}
public int getTurnAroundTime() {
return TurnAroundTime;
}
public void setTurnAroundTime(int turnAroundTime) {
TurnAroundTime = turnAroundTime;
}
public double getWeightTurnAroundTime() {
return WeightTurnAroundTime;
}
public void setWeightTurnAroundTime(double weightTurnAroundTime) {
WeightTurnAroundTime = weightTurnAroundTime;
}
public String getServiceStatus() {
return ServiceStatus;
}
public void setServiceStatus(String serviceStatus) {
ServiceStatus = serviceStatus;
}
@Override
public int compareTo(Mission o) {
if (this.ArrivalTime >= o.getArrivalTime()) {
return 1;
}
return -1;
}
}
主类(Main):
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
List<Mission> list = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
System.out.println("输入任务数");
int n = scanner.nextInt();
scanner.nextLine();
System.out.println("输入作业名 到达时间 服务时间");
for (int i = 0; i < n; i++) {
String s = scanner.nextLine();
String[] ss = s.split(" ");
Mission mission=new Mission();
mission.setName(ss[0]);
mission.setArrivalTime(Integer.parseInt(ss[1]));
mission.setServiceTime(Integer.parseInt(ss[2]));
mission.setServiceStatus("W"); //状态初始为W
list.add(mission);
}
Collections.sort(list);//按到达时间排序
new Dispatch(list); //调度
}
}
调度类(Dispatch):
import java.util.List;
public class Dispatch {
public Dispatch(List<Mission> list) {
System.out.println("准备调度作业");
for (Mission m : list) {
System.out.println(m.getName() + "-" + m.getServiceStatus());
}
//第一个
//开始时间
list.get(0).setStartingTime(list.get(0).getArrivalTime());
//完成时间
list.get(0).setFinishingTime(list.get(0).getArrivalTime() + list.get(0).getServiceTime());
//周转时间
list.get(0).setTurnAroundTime(list.get(0).getFinishingTime() - list.get(0).getArrivalTime());
//带权周转时间
list.get(0).setWeightTurnAroundTime((double) list.get(0).getTurnAroundTime() / (double) list.get(0).getServiceTime());
//状态
list.get(0).setServiceStatus("F");
System.out.println("处理=" + list.get(0).getName() +
" 周转时间=" + list.get(0).getTurnAroundTime() +
" 带权周转时间=" + list.get(0).getWeightTurnAroundTime());
for (Mission m : list) {
System.out.println(m.getName() + "-" + m.getServiceStatus());
}
//第二个及以后的
for (int i = 1; i < list.size(); i++) {
//开始时间
list.get(i).setStartingTime(list.get(i - 1).getFinishingTime());
//完成时间
list.get(i).setFinishingTime(list.get(i).getStartingTime() + list.get(i).getServiceTime());
//周转时间
list.get(i).setTurnAroundTime(list.get(i).getFinishingTime() - list.get(i).getArrivalTime());
//带权周转时间
list.get(i).setWeightTurnAroundTime((double)list.get(i).getTurnAroundTime() / (double) list.get(i).getServiceTime());
//状态
list.get(i).setServiceStatus("F");
System.out.println("处理=" + list.get(i).getName() +
" 周转时间=" + list.get(i).getTurnAroundTime() +
" 带权周转时间=" + list.get(i).getWeightTurnAroundTime());
for (Mission m : list) {
System.out.println(m.getName() + "-" + m.getServiceStatus());
}
}
}
}
测试:
运行结果
这是本人的第一篇简书呦,如有不足,还请指正哦~
源码在GitHub:https://github.com/FangWolf/simFCFS-SJF