操作系统模拟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<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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • 在计算机系统中,可能同时有数百个批处理作业存放在磁盘的作业队列中,或者有数百个终端与主机相连接。如何从这些作业中挑...
    谁吃了我的薯条阅读 1,954评论 0 2
  • 处理机调度与死锁 处理机调度的层次 高级调度/作业调度/长程调度 作用:将外存后备队列中的作业调入内存 对象:作业...
    颜洛滨阅读 840评论 0 1
  • 操作系统概论 操作系统的概念 操作系统是指控制和管理计算机的软硬件资源,并合理的组织调度计算机的工作和资源的分配,...
    野狗子嗷嗷嗷阅读 11,936评论 3 34
  • 有时候我也会钻进死胡同里,不明白我们到底是要做成自己的样子,还是别人眼里看到的觉得正确的样子。 如果不按照别人认为...
    给我一只猴子阅读 153评论 0 0
  • 很久没有这么安静酣畅淋漓的看书了,回到文字空间真好,一本旧书一些旧事。穿越时空的隧道,回到那山林朝野,春花秋叶,夏...
    任小暴阅读 451评论 0 1