美文网首页
操作系统模拟FCFS作业调度(Java实现)

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

作者: 獠牙血狼 | 来源:发表于2018-04-11 20:43 被阅读327次

    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

    相关文章

      网友评论

          本文标题:操作系统模拟FCFS作业调度(Java实现)

          本文链接:https://www.haomeiwen.com/subject/qrmzhftx.html