操作系统模拟FCFS作业调度(Java实现)

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 {
    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 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 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

你可能感兴趣的:(操作系统模拟FCFS作业调度(Java实现))