0、资源链接:csdn资源下载

一、 设计要求

编写并调试一个单道处理系统的作业调度模拟程序。分别采用先来先服务(FCFS),以及优先权优先调度算法,简单轮转法调度算法进行调度。对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。

二、 运行环境

此程序运行于Java 16.0.2 环境中,在windows系统

三、 系统功能

模拟多作业的调度,本程序采用了可选择先来先服务算法、优先权优先算法和简单轮转算法进行调度。
用户使用模拟功能前先输入自定义的作业信息包括:序号、作业名、优先级、服务时间和到达时间。然后通过选择框选择需要使用的调度算法进行执行模拟,将会得到以上信息以及开始运行时间、结束运行时间、周转时间和带权周转时间的表格信息,以及总平均周转时间和平均带权周转时间。
用户在执行后也可以进行撤销执行,方便用户体验其他算法,避免重复输入进程信息的繁琐。

四、 所用的数据结构

public class JCB {public int id;            //序号public String name;        //作业名public int priority;       //优先级public double workTime;    //服务时间public double arriveTime;  //到达时间public double beginTime;   //开始运行时间public double finshTime;   //运行结束时间public double TAT;         //周转时间public double WTAT;        //带权周转时间public double serviceTime = 0; //已服务时间
}

五、 主要函数功能

  1. 先来先服务算法(FCFS)
public class FCFS {public static ArrayList<JCB> FCFS(ArrayList<JCB> JCBArr) {//根据到达时间将输入队列排序,同时到达的进程根据序号排序for(int i=0;i<JCBArr.size();i++) {for(int k=i+1;k<JCBArr.size();k++) {if(JCBArr.get(i).getArriveTime()>JCBArr.get(k).getArriveTime()) {Collections.swap(JCBArr, i, k);}}}//存储结果数组ArrayList<JCB> workArr = new ArrayList<JCB>();for(JCB j : JCBArr) {if(workArr.size() == 0){    //执行第一个进程j.setBeginTime(j.getArriveTime());j.setFinshTime(j.getBeginTime()+j.getWorkTime());} else {j.setBeginTime(workArr.get(workArr.size()-1).getFinshTime());j.setFinshTime(j.getBeginTime()+j.getWorkTime());}workArr.add(j);}return workArr;}
}
  1. 优先权优先调度算法(PSA),设定优先数越小优先级越高
public class PSA {public static ArrayList<JCB> PSA(ArrayList<JCB> JCBArr) {//根据到达时间获取第一个到达并且优先权最高的进程JCB first;first = JCBArr.get(0);for(int i=0;i<JCBArr.size();i++) {if(first.getArriveTime() == JCBArr.get(i).getArriveTime()) {if(first.getPriority() > JCBArr.get(i).getPriority()) {first = JCBArr.get(i);}} else if(first.getArriveTime() > JCBArr.get(i).getArriveTime()) {first = JCBArr.get(i);}}//复制原PCB数组ArrayList<JCB> tempArr = new ArrayList<JCB>();for (int i=0;i<JCBArr.size();i++) {tempArr.add(JCBArr.get(i));}//第一个进入工作队列中ArrayList<JCB> workArr = new ArrayList<JCB>();  //存储结果数组workArr.add(first);workArr.get(0).setBeginTime(first.getArriveTime());workArr.get(0).setFinshTime(first.getArriveTime()+first.getWorkTime());//删除已经进入工作队列的第一个进程的PCBtempArr.remove(first);//剩下的进程通过优先权优先调度算法依次进入工作队列while(!tempArr.isEmpty()) {ArrayList<JCB> temp = new ArrayList<JCB>();double lastFinshTime = workArr.get(workArr.size()-1).getFinshTime();//筛选出在上一个进程结束前到达的进程放入temp数组for(JCB j : tempArr) {if(j.getArriveTime() < lastFinshTime) {temp.add(j);}}if(temp.isEmpty()){for(JCB j : tempArr) {temp.add(j);}}//筛选出temp数组中优先权最高的进程first2JCB first2;first2 = temp.get(0);for(int i=0;i<temp.size();i++) {if(first2.getPriority() > temp.get(i).getPriority())first2 = temp.get(i);}//将first2对应进程放入工作队列并运行,同时在临时复制的PCB(tempArr)中删除该进程的PCBfirst2.setBeginTime(lastFinshTime);first2.setFinshTime(first2.getBeginTime()+first2.getWorkTime());workArr.add(first2);tempArr.remove(first2);temp.clear();}return workArr;}
}
  1. 简单轮转法调度算法(RR)
public class RR {//设置时间片Tpublic static double T = 0.5;//简单轮转法调度算法(RR)public static ArrayList<JCB> RR(ArrayList<JCB> JCBArr) {//根据到达时间将输入队列排序,同时到达的进程根据序号排序//轮换时间算法在排序确定以后都是按照这个顺序进行调度的for(int i=0;i<JCBArr.size();i++) {for(int k=i+1;k<JCBArr.size();k++) {if(JCBArr.get(i).getArriveTime()>JCBArr.get(k).getArriveTime()) {Collections.swap(JCBArr, i, k);}}}//记录当前时间double nowTime = JCBArr.get(0).getArriveTime();int flag = 1;   //标志是否全部作业都已完成while(flag == 1){for (int i=0;i<JCBArr.size();i++){//设置开始运行时间if(JCBArr.get(i).getServiceTime() == 0){JCBArr.get(i).setBeginTime(nowTime);}//判断作业是否已经完成,完成则跳过此次循环,没有则继续更新时间if(JCBArr.get(i).getServiceTime() >= JCBArr.get(i).getWorkTime()) {continue;} else {//每次轮换更新当前时间nowTime += T;//每次轮换更新一次已服务时间JCBArr.get(i).setServiceTime(JCBArr.get(i).getServiceTime() + T);//每次轮换完后都将作业的完成时间暂时设置成当前时间,如果作业已完成则不需更新,如果还未完成则继续更新JCBArr.get(i).setFinshTime(nowTime);}//如果最后flag还是为1的话那么说明还有作业没有完成,继续循环flag = 0;for (int k=0;k<JCBArr.size();k++){if(JCBArr.get(k).getServiceTime() < JCBArr.get(k).getWorkTime()) {flag = 1;}}}}return JCBArr;}
}
  1. 图形化相关代码
    由于代码过长将不放在报告内影响报告篇幅

六、 运行情况

  1. 测试用例(序号、作业名、优先级、服务时间、到达时间)
    new JCB(1, “J1”, 3, 10, 1);
    new JCB(2, “J2”, 1, 3, 1);
    new JCB(3, “J3”, 5, 2, 3);
    new JCB(4, “J4”, 4, 1, 3);
    new JCB(5, “J5”, 2, 5, 3);
    到达时间有相同且有存在后备队列等待能很好测试各个调度算法

  2. 先来先服务调度算法

  3. 优先权优先调度算法

  4. 简单轮转法调度算法
    输入时间片,测试用例时间片为1

0、资源链接:csdn资源下载

Java实现操作系统作业调度模拟程序+GUI图形化相关推荐

  1. Java实现操作系统进程调度模拟程序+GUI图形化

    0.资源下载链接:csdn资源下载 一. 设计要求 编写并调试一个模拟的进程调度程序,采用采用分别先来先服务(FCFS),以及最短进程优先(SPF).响应比高者优先(HRN)的调度算法进行调度. 二. ...

  2. java swing(GUI图形化界面)基础教程3-添加事件监听1

    学习此内容前建议先去学习java基础知识: 匿名内部类 (学的多的可以用lambda表达式,更加简便) 好, 我们先看一下之前的代码(即一个窗口和一个按钮) 如果想看详细内容,链接为: (23条消息) ...

  3. 黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  4. 运维之道 | CentOS7.6 安装部署KVM虚拟机(GUI图形化安装)

    前言 KVM虚拟技术是完全的虚拟化,VPS之间不共用母机CPU和内存,VPS之间资源使用是独立的,互不影响.由于是完全的虚拟化,KVM虚拟技术的VPS理论上支持安装linux和windows任何版本, ...

  5. Python和R的GUI图形化编程与用户界面

    GUI图形用户界面 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面. 图形用户界面是一种人与计算机通信的界面显 ...

  6. GUI图形化界面(后篇)

    Swing编程目录 1.1 Swing概述 1.2 Swing基本组件的用法 1.2.1 Swing组件层次 1.2.2 AWT组件的Swing的实现 1.2.3 为组件设置边框 1.2.4 使用JT ...

  7. java图形界面计算器_java实现图形化界面计算器

    本文实例为大家分享了java实现图形化界面计算器的具体代码,供大家参考,具体内容如下 最终效果图: 项目流程: 第一步:实现图形化界面(添加计算器的 Button 和 用于显示输入数字.输出结果的JT ...

  8. GUI(图形化界面)

    一.Java GUI简介   图形用户界面(Graphics User Interface,GUI,图形化的用户接口)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作. 二.Swing的基本 ...

  9. java界面化_java怎么实现图形化界面

    展开全部 java图形化界面还62616964757a686964616fe78988e69d8331333363373232是有很多内容要学习的,可以参考 如下实例:public class Tes ...

最新文章

  1. python里transmap_c++学习笔记-map的使用实例(单词转换)
  2. 计算机省赛教案,《计算机系统的组成》最新 参赛教案.doc
  3. centos7.2源码安装openssl1.0.2
  4. 低版本webview无法请求jquery ajax
  5. csv文件python是怎么输入的,python怎么读取和写入csv文件
  6. C#写的ftp上传类
  7. VirtualBox centos下设置共享文件夹
  8. Ubuntu 下用 enca 转化文件字符编码
  9. 1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)...
  10. 让Editplus成为强大的PHP编辑器
  11. html5 电商模板,多用途电商HTML模板
  12. 【数字图像处理matlab】sobel、prewitt算子图像锐化
  13. 让校园生活更轻松的十大Android应用程序
  14. 【庄碰辉】万般滋味,皆是生活常态
  15. 2010世界财富排行榜
  16. Python之禅——个人翻译
  17. jmeter获取上一个接口的返回值作为下一个接口的传入参数
  18. 写个.net开发者的Linux迁移指南
  19. pythony第三章:列表、元组、字典和集合(1)
  20. 分析万篇途牛旅游游记为你挑选最佳旅游景点

热门文章

  1. 腾讯 android安全,腾讯安全玄武实验室:市面主流安卓应用存在用户数据“被克隆”风险...
  2. 软件开发项目的体系化管理流程
  3. 古典密码算法(凯撒密码,矩阵换位密码) python实现
  4. AI算法岗挤破头,招录比100:1,你对人工智能还有信仰吗?
  5. Windows11 ISO安装
  6. Zynq-Linux移植学习笔记之49-国产ZYNQ适配国产裕太PHY网络调试
  7. [学习笔记]黑马程序员Spark全套视频教程,4天spark3.2快速入门到精通,基于Python语言的spark教程
  8. PyTorch 自定义 Dataset 及训练集、测试集划分方法
  9. 计算机毕业设计 基于javaWeb的高校科研项目管理系统
  10. 匹配追踪MP和正交匹配追踪OMP算法