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

一、 设计要求

编写并调试一个模拟的进程调度程序,采用采用分别先来先服务(FCFS),以及最短进程优先(SPF)、响应比高者优先(HRN)的调度算法进行调度。

二、 运行环境

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

三、 系统功能

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

四、 所用的数据结构

public class PCB {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;        //带权周转时间
}

五、 主要函数功能

  1. 先来先服务算法(FCFS)
public class FCFS {public static ArrayList<PCB> FCFS(ArrayList<PCB> PCBArr) {//根据到达时间将输入队列排序,同时到达的进程根据序号排序for(int i=0;i<PCBArr.size();i++) {for(int j=i+1;j<PCBArr.size();j++) {if(PCBArr.get(i).getArriveTime()>PCBArr.get(j).getArriveTime()) {Collections.swap(PCBArr, i, j);}}}//复制原PCB数组ArrayList<PCB> tempArr = PCBArr;//存储结果数组ArrayList<PCB> workArr = new ArrayList<PCB>();for(PCB p : tempArr) {if(workArr.size() == 0){    //执行第一个进程p.setBeginTime(p.getArriveTime());p.setFinshTime(p.getBeginTime()+p.getWorkTime());} else {p.setBeginTime(workArr.get(workArr.size()-1).getFinshTime());p.setFinshTime(p.getBeginTime()+p.getWorkTime());}workArr.add(p);}return workArr;}
}
  1. 最短进程优先算法(SPF)
public class SPF {public static ArrayList<PCB> SPF(ArrayList<PCB> PCBArr) {//根据到达时间获取第一个到达并且服务时间较短的进程PCB first;first = PCBArr.get(0);for(int i=0;i<PCBArr.size();i++) {if(first.getArriveTime() == PCBArr.get(i).getArriveTime()) {if(first.getWorkTime() > PCBArr.get(i).getWorkTime()) {first = PCBArr.get(i);}} else if(first.getArriveTime() > PCBArr.get(i).getArriveTime()) {first = PCBArr.get(i);}}//复制原PCB数组ArrayList<PCB> tempArr = new ArrayList<PCB>();for (int i=0;i<PCBArr.size();i++) {tempArr.add(PCBArr.get(i));}//第一个进入工作队列中ArrayList<PCB> workArr = new ArrayList<PCB>();  //存储结果数组workArr.add(first);workArr.get(0).setBeginTime(first.getArriveTime());workArr.get(0).setFinshTime(first.getArriveTime()+first.getWorkTime());//删除已经进入工作队列的第一个进程的PCBtempArr.remove(first);//剩下的进程通过最短进程优先调度算法依次进入工作队列while(!tempArr.isEmpty()) {ArrayList<PCB> temp = new ArrayList<PCB>();double lastFinshTime = workArr.get(workArr.size()-1).getFinshTime();//筛选出在上一个进程结束前到达的进程放入temp数组for(PCB p : tempArr) {if(p.getArriveTime() < lastFinshTime) {temp.add(p);}}if(temp.isEmpty()){for(PCB p : tempArr)temp.add(p);}//筛选出temp数组中最短的进程first2PCB first2;first2 = temp.get(0);for(int i=0;i<temp.size();i++) {if(first2.getWorkTime() > temp.get(i).getWorkTime())first2 = temp.get(i);}//将first2对应进程放入工作队列并运行,同时在临时复制的PCB(tempArr)中删除该进程的PCBfirst2.setBeginTime(lastFinshTime);first2.setFinshTime(first2.getBeginTime()+first2.getWorkTime());workArr.add(first2);tempArr.remove(first2);}return workArr;}
}
  1. 响应比高者优先算法(HRN)
public class HRN {//响应比 =(等待时间 + 工作时间)/ 工作时间public static ArrayList<PCB> HRN(ArrayList<PCB> PCBArr) {//由于刚开始多个进程如果同时第一个到达,其响应比都为1,所以不做判断,只根据到达时间获取第一个到达的进程PCB first;first = PCBArr.get(0);for(int i=0;i<PCBArr.size();i++) {if(first.getArriveTime() > PCBArr.get(i).getArriveTime()) {first = PCBArr.get(i);}}//复制原PCB数组ArrayList<PCB> tempArr = new ArrayList<PCB>();for (int i=0;i<PCBArr.size();i++) {tempArr.add(PCBArr.get(i));}//第一个进入工作队列中ArrayList<PCB> workArr = new ArrayList<PCB>();    //存储结果数组workArr.add(first);workArr.get(0).setBeginTime(first.getArriveTime());workArr.get(0).setFinshTime(first.getArriveTime()+first.getWorkTime());//删除已经进入工作队列的第一个进程的PCBtempArr.remove(first);//剩下的进程通过响应比高者优先调度算法依次进入工作队列while(!tempArr.isEmpty()) {ArrayList<PCB> temp = new ArrayList<PCB>();double lastFinshTime = workArr.get(workArr.size()-1).getFinshTime();//筛选出在上一个进程结束前到达的进程放入temp数组for(PCB p : tempArr) {if(p.getArriveTime() < lastFinshTime) {temp.add(p);}}if(temp.isEmpty()){for(PCB p : tempArr)temp.add(p);}//筛选出temp数组中响应比最高的进程first2PCB first2;first2 = temp.get(0);//记录当前first2指定进程的响应比double largeHrn = ((workArr.get(workArr.size()-1).getFinshTime()-first2.getArriveTime()) + first2.getWorkTime()) / first2.getWorkTime();for(int i=0;i<temp.size();i++) {double hrn = ((workArr.get(workArr.size()-1).getFinshTime()-temp.get(i).getArriveTime()) + temp.get(i).getWorkTime()) / temp.get(i).getWorkTime();if(largeHrn < hrn) {largeHrn = hrn;first2 = temp.get(i);}}//将first2对应进程放入工作队列并运行,同时在临时复制的PCB(tempArr)中删除该进程的PCBfirst2.setBeginTime(lastFinshTime);first2.setFinshTime(first2.getBeginTime()+first2.getWorkTime());workArr.add(first2);tempArr.remove(first2);}return workArr;}
}
  1. 图形化相关代码
    由于代码过长将不放在报告内影响报告篇幅

六、 运行情况

  1. 测试用例(序号、进程名、优先级、服务时间、到达时间)
    new PCB(1, “P1”, 3, 10, 1);
    new PCB(2, “P2”, 1, 3, 1);
    new PCB(3, “P3”, 5, 2, 3);
    new PCB(4, “P4”, 4, 1, 3);
    new PCB(5, “P5”, 2, 5, 3);
    到达时间有相同且有存在后备队列等待能很好测试各个调度算法

  2. 先来先服务调度算法

  3. 最短进程优先调度算法

  4. 高响应比者调度算法

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

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

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

    0.资源链接:csdn资源下载 一. 设计要求 编写并调试一个单道处理系统的作业调度模拟程序.分别采用先来先服务(FCFS),以及优先权优先调度算法,简单轮转法调度算法进行调度.对每种调度算法都要求打 ...

  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. Git中的Sign Off功能是什么?
  2. 阿里P9架构师分享:通俗易懂Redis原理,都是你没看过的
  3. Java演示手机发送短信验证码功能实现
  4. C++ 对引用的理解
  5. USACO / Cow Pedigrees(DP)
  6. 开发者应该了解的API技术清单!
  7. 自学python要多久-怎么自学python,大概要多久?
  8. python爬虫什么意思-Python爬虫可以做什么?
  9. Coursera机器学习week11 单元测试
  10. 视频时帧率达到15,人眼就感觉是连续的
  11. java里oop思想_(一)OOP思想详解
  12. 74HC595在【8x8LED点阵】中的运用
  13. origin数据平滑_Origin平滑曲线的使用方法
  14. 修心修行“十一字”真言
  15. MATLAB角度转换
  16. 为什么国外程序员的创造力比中国程序员强?
  17. 有 1000 瓶药物,但是其中有一瓶是有毒的,老鼠只要服用任意量有毒药水就会在一个星期内死掉!请问,在一个星期后找出有毒的药物,最少需要多少只小白鼠?
  18. python argparse 和opencv模块的组合使用_如何利用Python3和OpenCV对比两张图片的不同,提取差异性...
  19. Java + Swing + MySQL实现图书管理系统
  20. 玩客云快速入门刷机相关教程

热门文章

  1. 通信软件行业规模及未来发展前景
  2. 系列漫画:神秘的程序员们 全集连载——绝对经典
  3. 滚动截屏苹果_苹果全球开发者大会最全汇总:平板推独立系统 两款新硬件亮相...
  4. 坦克大战-基础版01
  5. 清洁保养水槽洗碗机_如何在洗碗机中清洁肮脏的键盘(不破坏它)
  6. AJMJ面包服146/羽绒被79/长虹电暖气109/积雪草面膜19.9/40条蓝山咖啡9.9/洗牙神器/啄木鸟针织衫...
  7. 今天手机(ME525 Androdi2.2)神州行GPRS移动上网终于设置好了!!!
  8. Go语言学习笔记——正则表达式
  9. 基于音乐识别的频谱转换算法——常数Q变换CQT(转载修改)
  10. 拿数据说话,教你侦破“人人猎头”的谎言