处理机调度算法

news/2024/4/26 12:07:44/文章来源:https://blog.csdn.net/Protinx/article/details/128107110
import java.util.*;class JCB {String name;// 进程名int arriveTime;// 到达时间int serveTime;// 服务时间int beginTime;// 开始时间int finishTime;// 结束时间int roundTime;// 周转时间double aveRoundTime;// 带权周转时间double clock = 0;// 在时间轮转调度算法中,记录该进程真实服务时间已经用时的时长int waitTime;// 记录每个进程到达后的等待时间,只用于最高响应比优先调度算法中boolean firstTimeTag = false;// 在RR算法中标识开始时间是否第一次计算public JCB(String name, int arriveTime, int serveTime, double waitTime) {this.name = name;this.arriveTime = arriveTime;this.serveTime = serveTime;this.waitTime = 0;}public String toString() {String info = new String("进程名:P" + this.name);return info;}}class processMenu {ArrayList<JCB> jcb;// 存放所有进程LinkedList<JCB> link;// 存放已经进入队列的进程ArrayList<JCB> new_jcb;// 存放按指定调度算法排序后的进程JCB nowProess;// 当前应执行进程public void init() {// 初始化jcb = new ArrayList<JCB>();link = new LinkedList<JCB>();new_jcb = new ArrayList<JCB>();JCB p1 = new JCB("1", 0, 4, 3);JCB p2 = new JCB("2", 1, 3, 2);JCB p3 = new JCB("3", 2, 5, 3);JCB p4 = new JCB("4", 3, 2, 1);JCB p5 = new JCB("5", 4, 4, 5);jcb.add(p1);jcb.add(p2);jcb.add(p3);jcb.add(p4);jcb.add(p5);// 先将jcb排序,便于下面的算法实现,就不需要再定义一个标识进程是否已到达的boolean,即无需每次都从头开始扫描jcb容器,// 而是用一个K记录下当前已经扫描到的位置,一次遍历即可,提高了算法效率。Collections.sort(jcb, new compareAt_St());}public void FCFS() {// 先来先服务算法ProcessQueue pq = new ProcessQueue();// 调用内部类pq.EnqueueLast();// 让最先到达的进程先入队System.out.println("*****************************************************");while (!link.isEmpty()) {// while(new_jcb.size()!=jcb.size())pq.DisplayQueue();// 打印当前队列中的进程pq.Dequeue();// 出队,一次一个pq.EnqueueLast();// 已到达的进程入队}}public void SJF() {// 短作业优先算法ProcessQueue pq = new ProcessQueue();pq.EnqueueLast();System.out.println("*****************************************************");while (!link.isEmpty()) {pq.DisplayQueue();// 打印当前队列中的进程pq.Dequeue();// 出队,一次一个pq.EnqueueLast();// 已到达的进程入队Collections.sort(link, new compareSt());// 队列中的进程还需按服务时间长度进行排序}}public void HRRN() {// 最高响应比优先调度算法ProcessQueue pq = new ProcessQueue();pq.EnqueueLast();System.out.println("*****************************************************");while (!link.isEmpty()) {pq.DisplayQueue();// 打印当前队列中的进程pq.Dequeue();// 出队,一次一个pq.EnqueueLast();// 已到达的进程入队Collections.sort(link, new comparePriority());// 队列中的进程还需按响应比进行排序}}class ProcessQueue {int k = 0;// jcb中的进程遍历时的下标int nowTime = 0;// 当前时间double sliceTime;// 轮转调度时间片int i = 0;// 记录当前出入队列的次数public void EnqueueLast() {// 进程首次入队,可一次进多个,从队尾进入while (k < jcb.size()) {// 当遍历完jcb中的所有进程时结束if (jcb.get(k).arriveTime <= nowTime) {// 已经到达的进程按到达时间先后进入队列link.addLast(jcb.get(k));k++;} else {break;// 如果该进程还未入队,即先结束遍历,保留当前下标k值,注意:此处不要k--;}}}public void EnqueueFirst() {// 进程首次入队,可一次进多个,从队首进入while (k < jcb.size()) {// 当遍历完jcb中的所有进程时结束if (jcb.get(k).arriveTime <= nowTime) {// 已经到达的进程按到达时间先后进入队列link.addFirst(jcb.get(k));k++;} else {break;// 如果该进程还未入队,即先结束遍历,保留当前下标k值,注意:此处不要k--;}}}public void Dequeue() {// 进程出队,一次只出一个nowProess = link.removeFirst();// 移除队列的队首元素并且返回该对象元素nowProess.beginTime = nowTime;// 计算开始时间,即为上一个进程的结束时间nowProess.finishTime = nowProess.beginTime + nowProess.serveTime;// 计算结束时间,该进程开始时间+服务时间nowProess.roundTime = nowProess.finishTime - nowProess.arriveTime;// 计算周转时间nowProess.aveRoundTime = (double) nowProess.roundTime / nowProess.serveTime;// 计算平均周转时间nowTime = nowProess.finishTime;// 获得结束时间,即当前时间,方便判断剩下的进程是否已到达new_jcb.add(nowProess);// 经处理过数据后加入new_jcb容器for (int i = 0; i < link.size(); ++i) {link.get(i).waitTime++;// 所有进入等待队列的进程等待时间+1,此处只为最高响应比算法所用}}public void Dequeue(double sliceTime) {// 重载Dequeue方法,实现轮转调度算法的出队nowProess = link.removeFirst();// 移除队列的队首元素并且返回该对象元素if (nowProess.firstTimeTag == false) {/** 轮转调度进程可能会多次反复进出队列,不像FCFS和SJF的进程只会进出一次,所以计算开始时间可以设个标志位,让每个进程在* 第一次执行时记录一遍即可*/nowProess.beginTime = nowTime;// 进程开始执行的时间nowProess.firstTimeTag = true;// 计算第一次即可,下次无需更新计算}nowTime += sliceTime;// 每次出队,用时一个时间片,更新当前时间nowProess.clock += sliceTime;// 更新当前出队列的进程已服务时间if (nowProess.clock >= nowProess.serveTime) {nowProess.finishTime = nowTime;// 计算该进程完成时间nowProess.roundTime = nowProess.finishTime - nowProess.arriveTime;// 计算周转时间nowProess.aveRoundTime = (double) nowProess.roundTime / nowProess.serveTime;// 计算平均周转时间new_jcb.add(nowProess);// 经处理过数据后加入new_jcb容器EnqueueFirst();// 已到达的进程先入队} else {EnqueueFirst();// 已到达的进程先入队link.addLast(nowProess);// 上一轮出的再紧接着进入队尾}}public void DisplayQueue() {// 队列中等候的进程i++;System.out.println("第" + i + "次队列中排队的进程:" + link);}}public void printProcess() {System.out.println("进程名 到达时间  服务时间   开始时间  完成时间  周转时间  带权周转时间");for (int i = 0; i < new_jcb.size(); ++i) {System.out.println("P" + new_jcb.get(i).name + "   " + new_jcb.get(i).arriveTime + "      " +new_jcb.get(i).serveTime + "     " + new_jcb.get(i).beginTime + "     " + new_jcb.get(i).finishTime +"     " + new_jcb.get(i).roundTime + "    " + new_jcb.get(i).aveRoundTime);}new_jcb.clear();// 清空new_jcb容器内的内容,方便存储各种算法的结果并展示}
}class compareSt implements Comparator<JCB> {// 按服务时间升序public int compare(JCB arg0, JCB arg1) {return arg0.serveTime - arg1.serveTime;}
}class compareAt_St implements Comparator<JCB> {// 按到达时间升序,若到达时间相同,按服务时间升序public int compare(JCB o1, JCB o2) {int a = o1.arriveTime - o2.arriveTime;if (a > 0)return 1;else if (a == 0) {return o1.serveTime > o2.serveTime ? 1 : -1;} elsereturn -1;}
}class comparePriority implements Comparator<JCB> {// 按响应比升序排序public int compare(JCB o1, JCB o2) {double r1 = (double) o1.waitTime / o1.serveTime;double r2 = (double) o2.waitTime / o2.serveTime;return r1 > r2 ? 1 : -1;}}public class TestProcess {public static void main(String[] args) {processMenu pm = new processMenu();pm.init();// 初始化容器System.out.println("请输入您想看到的进程调度结果序号即可:\n" +"输入1:先来先服务调度算法\n" +"输入2:短作业优先调度算法\n" +"输入3:最高响应比调度算法\n" +"输入0:结束进程");Scanner in=new Scanner(System.in);int data=in.nextInt();switch (data) {case 1:pm.FCFS();pm.printProcess();break;case 2:pm.SJF();pm.printProcess();break;case 3:pm.HRRN();pm.printProcess();break;case 0:System.exit(0);break;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_38923.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【visual studio】visual studio 2022 无法 复制黏贴

visual studio 2022 cannot copy paste 其他网友也有反馈到微软&#xff1a;VS 2022 Copy and Paste form feature Broken?Copy paste still not fixed in Visual studio 2022表现是突然就无法复制和黏贴了其他的app 就没有这个问题每次都是重启电脑解决。 2022年11月fix 今…

2.1 Redis中SDS的定义

每个sds.h/sdshdr 结构表示一个SDS值 struct sdshdr { //记录 buf 数组中已经使用的字节数量 //等于SDS所保存字符串的长度 int len;//记录buf数组中未使用字节的数量 int free;//字节数组,用于保存字符串 char buf[]; };图2-1 展示了一个SDS 示例: 1、free 属性值为0&#x…

【Spring项目中的Controller理解】

目录 1. 添加依赖 2. 关于异常 1. 添加依赖 首先&#xff0c;需要保障此项目中存在spring-boot-starter-web依赖项&#xff0c;否则&#xff0c;当前项目并不具备Web应用程序开发所需的依赖&#xff01; 提示&#xff1a;spring-boot-starter-web是建立在spring-boot-starte…

APS智能排产系统的优势

APS智能排产系统是通过同步考虑多种有限能力资源的约束&#xff0c;依据各种预设规则&#xff0c;针对解决&#xff1a;客户订单交期评估与答复、人工排产效率低、设备资源利用率低、物料计划与生产计划脱节、生产计划执行率低、库存积压与生产缺料等相关问题&#xff0c;依靠严…

安科瑞智能余压监控系统余压控制器ARPM-C 监控余压值/接收报警信息

1、概述 ARPM-C型余压控制器&#xff0c;可监控所连接余压探测器的余压值&#xff0c;接收余压探测器的报警信息&#xff0c;并向余压监控器反馈现场工作状态&#xff0c;当余压过高报警时联动风阀执行器调节泄压阀&#xff0c;能够持续调节泄压阀的开启角度。 2、产品型号 …

5G无线技术基础自学系列 | MIMO功能

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 无线通信的迅速发展对系统的容量和频谱…

Linux学习笔记(二)

命令 目录中找文件&#xff1a;find压缩tar&#xff1a;tar -cvf xxx.tar 文件解压缩tar&#xff1a;tar -xvf xxx.tar解压缩.gz文件&#xff1a;tar -zxvf xxx.tar.gz压缩.bz2文件&#xff1a;tar -jcvf xxx.tar.bz2解压到指定目录&#xff1a;tar -C 指定目录压缩zip&#xf…

Ensp用windows回环口连接cloud配置

Ensp模拟通过本机&#xff08;windows&#xff09;用python脚本批量配置华为数通设备时&#xff0c;为了避免对内网资源的浪费最好用回环口&#xff08;loopback&#xff09;。 一、windows开启loopback虚拟接口 概要&#xff1a; right click on window start menu icon an…

进阶自动化测试,你一定要知道的...

自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 自动化测试框架一般可以分为两个层次&#xff0c;上层是管理整个自动化测试的开发&a…

nodejs+vue音乐网站与分享平台

目 录 摘 要 I 1 绪论 1 1.1研究背景 1 1.2研究现状 1 1.3研究内容 2 2 系统关键技术 3 2.1 Spring Boot框架 3 2.2 JAVA技术 3 2.3 MYSQL数据库 4 2.4 B/S结构 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2经济可行性…

SpringBoot+html+vue模板开发

除了对某个表基本的增删改查以外&#xff0c;可能需要额外的增加操作&#xff0c;这里是通过按钮来实现的 1、新增一个测试按钮 <el-button type"primary" class"butT" click"test()">测试</el-button> 2、这个按钮绑定一个方法t…

线代 | 【提神醒脑】自用笔记串联三 —— 相似对角化 · 二次型 · 合同变换

本文总结参考于 kira 2023 线代提神醒脑技巧班。 笔记均为自用整理。加油!ヾ(◍∇◍)ノ゙ 九、相似对角化 9.1、矩阵相似的性质 ----------------------------------------------------------------------------------------------------------…

R语言基于决策树的银行信贷风险预警模型

引言 我国经济高速发展&#xff0c;个人信贷业务也随着快速发展&#xff0c;而个人信贷业务对提高内需&#xff0c;促进消费也有拉动作用。有正必有反&#xff0c;在个人信贷业务规模不断扩大的同时&#xff0c;信贷的违约等风险问题也日益突出&#xff0c;一定程度上制约着我…

运维行业数字化维修数据屏来袭

说起维修数字化&#xff0c;售后维保管理&#xff0c;大家必然想到青鸟云报修&#xff0c;今天我给大家呈现一下青鸟云报修数据大屏是怎么一回事。 这是青鸟云报修第三代数据大屏&#xff0c;在2代基础上增加了更多板块&#xff0c;更加专业和智能化&#xff0c;他主要应用于单…

传奇战盟GOM引擎登录器配置教程

战盟GOM引擎配置器教程&#xff0c;先到战盟官方网站下载登录器配置器&#xff0c;下载好后按下面说明使用。战盟GOM登录器教程大分类目录引导说明 一、解压配置器文件包后&#xff0c;打开KEY文件夹然后选择KEY 二、复制你选择好的 Key.Lic 复制到 战盟GOM配置器 相同路径文件…

AI强势入场,成就史上最快足球

众所周知&#xff0c;卡塔尔是全球最富裕的国度之一&#xff0c;是世界第一大液化天然气生成和出口国。丰富的石油资源&#xff0c;几乎让每一名原住民从出生之日起就实现财务自由&#xff0c;人均GDP高达6万多美元&#xff0c;钞能力毋庸置疑。 2022年世界杯正是在这片富饶的土…

mac上的python2安装

iiPython Release Python 2.7.18rc1 | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downloads/release/python-2718rc1/不小心把mac上的python2给删除了&#xff0c;发现老的nodejs项目需要pytho2&#xff0c;这下晕了&#xff0c;…

xss-labs/level12

这一关首先尝试以下 <script>alert(xss)</script> 不废话 直接看源代码 很明显发现第一个输出点被转义了 根本无法通过script标签来完成弹窗 然后依然是四个隐藏表单 我们可以先试一试在不用抓包工具的前提下 我们能不能将某个隐藏表单给显示出来 构造如下 &l…

基于深度学习的合成孔径雷达自聚焦

文章目录引言什么是合成孔径雷达什么是自聚焦经典自聚焦方法基于机器学习的方法基于极速学习机的方法基于深度学习的SAR自聚焦代码附录引言 本文全面介绍合成孔径雷达自聚焦概念和方法。想获取更为详尽的描述&#xff0c;请参考以下几篇论文, 如果数据或代码对你的研究有用&am…

R在GIS中用ggmap地理空间数据分析

概要 做过O2O&#xff08;Online To Offline,在线离线/线上到线下&#xff09;的小伙伴知道&#xff0c;GIS数据需要具体到精准的位置(即经纬度)&#xff1b;对于连锁门店&#xff0c;使用GIS和其它的数据密集型服务遵循一个简单的逻辑&#xff1a;数据有助于企业节省开支&…