一、算法思想:

高响应比优先调度算法(HRRN)是一种对CPU响应比的分配的一种算法。HRRN是介于FCFS(先来先服务算法)与SJF(短作业优先算法)之间的折中算法,既考虑作业等待时间又考虑作业运行时间,既照顾短作业又不使长作业等待时间过长,改进了调度性能。

二、实现代码:

package Package8;import java.util.Scanner;/*** 高响应比优先调度*/
public class HRRN {public static void main(String[] args) {PCB[] a = new PCB[10];// input方法用于输入进程信息,返回输入进程的总数int k = input(a);// 输出初始作业状态System.out.println("初始作业状态:");// 遍历输出数组output(a, k);// 找出最早到达的进程,优先调度PCB min = new PCB();min = a[0];int m = 0; // 用于记录最早到达进程的id(下标)for (int i = 0; i < k; i++) {if (a[i].getArriveTime() < min.getArriveTime()){min = a[i];m = i;} else if(a[i].getArriveTime() == min.getArriveTime() && a[i].getServiceTime() < min.getServiceTime()){min = a[i];m = i;}}PCB temp;temp = a[0];a[0] = min;a[m] = temp;System.out.println("调度过程:");// currentTime 用于记录当前时间(最后一个已经调度的作业的完成时间)double currentTime = 0;// 当该进程最早到达时,直接调度a[0].setCondition(1); // 调度进程,将进程状态改为运行a[0].setFinishTime(a[0].getArriveTime() + a[0].getServiceTime());a[0].setCyclingTime(a[0].getFinishTime() - a[0].getArriveTime());// 将结果保留两位小数double time = a[0].getCyclingTime() / a[0].getServiceTime();a[0].setFloat_Wi(Double.parseDouble(String .format("%.2f", time)));output(a,k); // 遍历数组a[0].setCondition(2); // 进程调度完毕,将进程状态改为完成// 记录当前时间currentTime = a[0].getFinishTime();for (int i = 1; i < k; i++) {for (int j = i; j < k; j++) {if (currentTime - a[j].getArriveTime() < 0){a[j].setWaitTime(0);} else {a[j].setWaitTime(currentTime - a[j].getArriveTime());}a[j].setDibs((a[j].getWaitTime()/a[j].getServiceTime()) + 1);}// 找出优先权最大的进程,放到第i个位置,直接调度PCB max;max = a[0]; // a[0]的优先级默认为0int n = 0; // 用于当前优先权最大进程的id(下标)for (int x = i; x < k; x++) {if (a[x].getDibs() > max.getDibs()){max = a[x];n = x;} else if (a[x].getDibs() == max.getDibs() && a[x].getArriveTime() < max.getArriveTime()){max = a[x];n = x;}}temp = a[i];a[i] = max;a[n] = temp;// 调度第i个进程a[i].setCondition(1);output(a,k);if (a[i].getArriveTime() > a[i - 1].getFinishTime()){a[i].setFinishTime(a[i].getArriveTime() + a[i].getServiceTime());} else{a[i].setFinishTime(a[i - 1].getFinishTime() + a[i].getServiceTime());}a[i].setCyclingTime(a[i].getFinishTime() - a[i].getArriveTime());// 将结果保留两位小数time = a[i].getCyclingTime() / a[i].getServiceTime();a[i].setFloat_Wi(Double.parseDouble(String .format("%.2f", time)));a[i].setCondition(2);// 记录当前时间currentTime = a[i].getFinishTime();// 一轮循环结束,进入下一轮循环}// 遍历输出数组System.out.println("调度后作业状态:");output(a, k);}/*** 该方法用于遍历输出数组* @param a* @param k*/public static void output(PCB[] a, int k){for (int i = 0; i < k; i++) {System.out.println(a[i]);if (i == k - 1){System.out.println();}}}/*** 该方法用于输入进程信息* @param a* @return 输入进程的个数*/public static int input(PCB[] a){Scanner scanner = new Scanner(System.in);int k = 0; // 初始化,k记录总进程数System.out.println("请一次输入两个整数,之间用空格隔开,输入负数结束输入");// 重复输入进程信息while (true){System.out.printf("请输入第%d进程到达时间、服务时间:", k);// 将进程id设置为kdouble arriveTime = scanner.nextDouble();if (arriveTime < 0){System.out.println("输入结束");break;}double serviceTime = scanner.nextDouble();a[k] = new PCB(k,arriveTime, serviceTime); // 利用构造方法初始化数据k ++;if (serviceTime < 0){System.out.println("输入结束");break;}}scanner.close(); // 释放scannerreturn k;}public static class PCB implements Package8.PCB {private int id;private double arriveTime; // 到达时间private double serviceTime; // 服务时间private double finishTime; // 完成时间private double cyclingTime; // 周转时间private double float_Wi; // 带权周转时间private double waitTime; // 等待时间private double dibs; // 优先权private int condition; // 进程状态,0表示等待,1表示运行,2表示完成public int getCondition() {return condition;}public void setCondition(int condition) {this.condition = condition;}public double getWaitTime() {return waitTime;}public void setWaitTime(double waitTime) {this.waitTime = waitTime;}public double getDibs() {return dibs;}public void setDibs(double dibs) {this.dibs = dibs;}public int getId() {return id;}public void setId(int id) {this.id = id;}public double getArriveTime() {return arriveTime;}public void setArriveTime(double arriveTime) {this.arriveTime = arriveTime;}public double getServiceTime() {return serviceTime;}public void setServiceTime(double serviceTime) {this.serviceTime = serviceTime;}public double getFinishTime() {return finishTime;}public void setFinishTime(double finishTime) {this.finishTime = finishTime;}public double getCyclingTime() {return cyclingTime;}public void setCyclingTime(double cyclingTime) {this.cyclingTime = cyclingTime;}public double getFloat_Wi() {return float_Wi;}public void setFloat_Wi(double float_Wi) {this.float_Wi = float_Wi;}public PCB() {}public PCB(int id, double arriveTime, double serviceTime) {this.id = id;this.arriveTime = arriveTime;this.serviceTime = serviceTime;}@Overridepublic String toString() {String condition1;if (condition == 2){condition1 = "完成";return "进程信息:" +"id=" + id +", 到达时间=" + arriveTime +", 服务时间=" + serviceTime +", 完成时间=" + finishTime +", 周转时间=" + cyclingTime +", 带权周转时间=" + float_Wi +", 进程状态:" + condition1;} else {if (condition == 1){condition1 = "运行";} else {condition1 = "等待";}return "进程信息:" +"id=" + id +", 到达时间=" + arriveTime +", 服务时间=" + serviceTime +", 完成时间=" + finishTime +", 周转时间=" + cyclingTime +", 带权周转时间=" + float_Wi +", 进程状态:" + condition1 +", 进程优先权:" + dibs;}}}
}

三、运行结果:

操作系统:高响应比优先调度算法(HRRN)Java代码实现相关推荐

  1. 操作系统高响应比优先调度算法代码_进程调度

    进程调度的定义 进程的调度就是操作系统进程管理的一个重要组成部分. 其任务是选择下一个要运行的进程. 那么如何进行选择呢? 要探明这一点,首先需要确定操作系统进程调度的目标是什么. 有了目标,我们就知 ...

  2. 作业调度算法【平均周转时间、平均带权周转时间、先来先服务FCFS、短作业优先SJF、高优先权(级)算法FPF、高响应比优先算法HRRN】

    文章目录 先来先服务算法(FCFS) 短作业优先算法(SJF).短进程优先算法(SPF) 周转时间和带权周转时间 高优先权(级)调度算法FPF 高响应比优先调度算法HRRN 先来先服务算法(FCFS) ...

  3. 高响应比优先调度算法

    任务描述 本关任务:编写一个高响应比优先调度算法解决一个实际的进程调度问题,并打印出每个进程的完成时间.周转时间和带权周转时间 相关知识 为了完成本关任务,你需要掌握:1.先来先服务调度算法,2.进程 ...

  4. 高响应比优先调度算法 (HRRN)例题

    高响应比优先调度算法(Highest Response Ratio Next)是一种对CPU中央控制器响应比的分配的一种算法.HRRN是介于FCFS(先来先服务算法)与SJF(短作业优先算法)之间的折 ...

  5. 操作系统调度算法--高响应比优先调度算法解析

    高响应比优先调度算法(Highest Response Radio Next,HRRN)是一种对CPU中央控制器响应比的分配的算法.HRRN是介于FCFS(先来先服务算法)与SJF(短作业优先算法)之 ...

  6. c语言链表最高响应比优先,操作系统--最高响应比优先调度算法实验报告..doc

    操作系统--最高响应比优先调度算法实验报告. 进程调度一.实验题目与要求 编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法.实现具体包括:首先确定作业控制块的内容和组成方式:然 ...

  7. 假设有四个作业,它们的提交、运行时间如下表所示。若采用高响应比优先调度算法,试问平均周转时间和平均带权周转时间为多少?

    处理机调度算法 题目: 假设有四个作业,它们的提交.运行时间如下表所示.若采用高响应比优先调度算法,试问平均周转时间和平均带权周转时间为多少? 高响应比优先(HRRN)调度算法 是对FCFS调度算法和 ...

  8. 非抢占的高响应比优先调度算法

    模拟操作系统进程调度 算法流程图 测试数据 进程名: A B C D E 需要运行时间: 3 6 4 5 2 5 ProcA 8 3 ProcB 10 6 ProcC 7 4 ProcD 12 5 P ...

  9. 先来先服务和高响应比优先调度算法C语言实现

    先来先服务和高响应比优先调度算法C语言实现 目录: 1.进程调度与作业调度的区别: 2.单道批处理系统与多道批处理系统的区别: 3.程序设计用到的公式: 4.高响应比优先算法特点: 5.源代码示例: ...

  10. 《操作系统》实验三:高响应比优先调度和时间片轮转RR进程调度算法

    [实验题目]:高响应比优先调度和时间片轮转RR进程调度算法 [实验学时]:4学时 [实验目的] 通过这次实验,加深对进程调度概念的理解,进一步掌握比FCFS和SJF更为复杂的进程调度算法的实现方法. ...

最新文章

  1. Android 仿微信朋友圈添加图片
  2. 入侵检测系统基础知识
  3. Dubbo 3.0 前瞻之:常用协议对比及 RPC 协议新形态探索
  4. [react] 展示组件和容器组件有什么区别?
  5. php ai库,收藏 | 深度学习框架、AI库、ML库、NLP库、CV库汇总!
  6. 除非 Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。IIS 7...
  7. Mac Os 安装github上的开源软件
  8. Navicate在同步oracle数据,不同数据库之间同步
  9. HDOJ(HDU) 1785 You Are All Excellent(角度运算)
  10. HDU 1054 Strategic Game(无向二分图的最大匹配)
  11. 项目难管理?先学会用好甘特图(内附操作方法及实用模板)
  12. 小管家进销存_美团入局共享充电宝,专家称或收购一两家,同行称雷声大雨点小...
  13. 仿写京东登录页面HTML/CSS
  14. 关于二重积分,三重积分的理解
  15. linux查看进程limits解释,linux中/etc/security/limits.conf配置文件说明
  16. 整除分块 B - Make Divisible
  17. C#和VB.net语法对比图_C#教程
  18. 【量化投资】03.量化工程abu学习之量化基础(1/3)
  19. 信息安全工程师学习笔记《第三章》
  20. Termios 百科

热门文章

  1. 给扔物线 HenCoder Plus 学员的一次分享文字版
  2. DataSet 用法
  3. 新萝卜家园 ghost xp3 2013 5月纯净版
  4. json编辑器插件 vue_vue-json-editor json编辑器
  5. 打算开源一个低代码平台,包含【工作流,业务流,财务,APQC】。技术站 React,typescript,java,mysql
  6. 普及一下IPTV行业
  7. Qt安装教程(Qt 6.4)
  8. MyBatis下载与简介
  9. SQL笔试经典50题
  10. 字节跳动sql笔试题