Java实现操作系统作业调度模拟程序+GUI图形化
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; //已服务时间
}
五、 主要函数功能
- 先来先服务算法(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;}
}
- 优先权优先调度算法(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;}
}
- 简单轮转法调度算法(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;}
}
- 图形化相关代码
由于代码过长将不放在报告内影响报告篇幅
六、 运行情况
测试用例(序号、作业名、优先级、服务时间、到达时间)
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);
到达时间有相同且有存在后备队列等待能很好测试各个调度算法
先来先服务调度算法
优先权优先调度算法
简单轮转法调度算法
输入时间片,测试用例时间片为1
0、资源链接:csdn资源下载
Java实现操作系统作业调度模拟程序+GUI图形化相关推荐
- Java实现操作系统进程调度模拟程序+GUI图形化
0.资源下载链接:csdn资源下载 一. 设计要求 编写并调试一个模拟的进程调度程序,采用采用分别先来先服务(FCFS),以及最短进程优先(SPF).响应比高者优先(HRN)的调度算法进行调度. 二. ...
- java swing(GUI图形化界面)基础教程3-添加事件监听1
学习此内容前建议先去学习java基础知识: 匿名内部类 (学的多的可以用lambda表达式,更加简便) 好, 我们先看一下之前的代码(即一个窗口和一个按钮) 如果想看详细内容,链接为: (23条消息) ...
- 黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面
------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...
- 运维之道 | CentOS7.6 安装部署KVM虚拟机(GUI图形化安装)
前言 KVM虚拟技术是完全的虚拟化,VPS之间不共用母机CPU和内存,VPS之间资源使用是独立的,互不影响.由于是完全的虚拟化,KVM虚拟技术的VPS理论上支持安装linux和windows任何版本, ...
- Python和R的GUI图形化编程与用户界面
GUI图形用户界面 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面. 图形用户界面是一种人与计算机通信的界面显 ...
- GUI图形化界面(后篇)
Swing编程目录 1.1 Swing概述 1.2 Swing基本组件的用法 1.2.1 Swing组件层次 1.2.2 AWT组件的Swing的实现 1.2.3 为组件设置边框 1.2.4 使用JT ...
- java图形界面计算器_java实现图形化界面计算器
本文实例为大家分享了java实现图形化界面计算器的具体代码,供大家参考,具体内容如下 最终效果图: 项目流程: 第一步:实现图形化界面(添加计算器的 Button 和 用于显示输入数字.输出结果的JT ...
- GUI(图形化界面)
一.Java GUI简介 图形用户界面(Graphics User Interface,GUI,图形化的用户接口)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作. 二.Swing的基本 ...
- java界面化_java怎么实现图形化界面
展开全部 java图形化界面还62616964757a686964616fe78988e69d8331333363373232是有很多内容要学习的,可以参考 如下实例:public class Tes ...
最新文章
- python里transmap_c++学习笔记-map的使用实例(单词转换)
- 计算机省赛教案,《计算机系统的组成》最新 参赛教案.doc
- centos7.2源码安装openssl1.0.2
- 低版本webview无法请求jquery ajax
- csv文件python是怎么输入的,python怎么读取和写入csv文件
- C#写的ftp上传类
- VirtualBox centos下设置共享文件夹
- Ubuntu 下用 enca 转化文件字符编码
- 1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)...
- 让Editplus成为强大的PHP编辑器
- html5 电商模板,多用途电商HTML模板
- 【数字图像处理matlab】sobel、prewitt算子图像锐化
- 让校园生活更轻松的十大Android应用程序
- 【庄碰辉】万般滋味,皆是生活常态
- 2010世界财富排行榜
- Python之禅——个人翻译
- jmeter获取上一个接口的返回值作为下一个接口的传入参数
- 写个.net开发者的Linux迁移指南
- pythony第三章:列表、元组、字典和集合(1)
- 分析万篇途牛旅游游记为你挑选最佳旅游景点
热门文章
- 腾讯 android安全,腾讯安全玄武实验室:市面主流安卓应用存在用户数据“被克隆”风险...
- 软件开发项目的体系化管理流程
- 古典密码算法(凯撒密码,矩阵换位密码) python实现
- AI算法岗挤破头,招录比100:1,你对人工智能还有信仰吗?
- Windows11 ISO安装
- Zynq-Linux移植学习笔记之49-国产ZYNQ适配国产裕太PHY网络调试
- [学习笔记]黑马程序员Spark全套视频教程,4天spark3.2快速入门到精通,基于Python语言的spark教程
- PyTorch 自定义 Dataset 及训练集、测试集划分方法
- 计算机毕业设计 基于javaWeb的高校科研项目管理系统
- 匹配追踪MP和正交匹配追踪OMP算法