操作系统-实验三 模拟处理机HRRN调度算法(Java实现)

实验三模拟处理机HRRN调度算法

一、实验目的:用c,c++,java设计HRRN调度算法程序。
二、实验内容:本实验随机输入的进程个数、进程名称、进程提交到系统的时间、进程运行所需时间。通过模拟程序。显示以下信息:
1)处理机对进程的调度过程。
2)计算这N个进程的平均周转时间。
三、HRRN(最高响应比调度算法)原理
最高响应比调度:在每次调度作业时,先计算后备队中每个作业的响应比,然后挑选响应比高者投入运行。
响应比R定义:
【操作系统-实验三 模拟处理机HRRN调度算法(Java实现)】R=(w+S)/S
(R:响应比,W=等待时间,S=运行时间)
响应比R= 周转时间 / 运行时间
=(运行时间 + 等待时间)/ 运行时间
= 1 +(等待时间 / 运行时间)
四、示例
如:输入
进程个数:5
进程名称到达系统时间所需服务时间
A03
B26
C44
D65
E82
显示运行结果:
进程名称到达系统时间 所需服务时间开始时间结束时间
A0303
B2639
C44913
E821315
D651520
5个进程的平均周转时间:(3+7+9+7+14)/5=8

五、运行结果
操作系统-实验三 模拟处理机HRRN调度算法(Java实现)
文章图片

操作系统-实验三 模拟处理机HRRN调度算法(Java实现)
文章图片


背景: 这是我们操作系统课程的一道实验题
做这道题,我只花了打算8分钟左右的样子,因为这道题和之前实验二的一道题差不多

解题思路:
首先进行根据提交时间排序一下,然后依次根据进程数来选择遍历次数
初始化当前时间为最先到达内存的进程的提交时间
然后判断在这个时间点有哪些任务已经到达内存,依次放入另外一个集合
对这个集合进行响应比排序,将响应比最高的进程进行执行,执行结束后当前时间为当前时间加上这个进程的所需时间
然后再判断在这个时间点有哪些任务已经到达内存,依次放入另外一个集合



代码如下:
package com.eternally.dfs; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; /** * HRRN算法 * @author Administrator * */public class Test2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); String name; float ttime; float needtime; List list = new ArrayList<>(); for(int i = 0; i < n; i ++) { name=in.next(); ttime=in.nextFloat(); needtime=in.nextFloat(); Pcb pcb = new Pcb(name, ttime, needtime); list.add(pcb); } Collections.sort(list); System.out.println("作业号提交时间所需时间开始时间完成时间"); float sum=list.get(0).ttime; List list2 = new ArrayList<>(); float sum1=0; for(int i = 0; i(); for(int j = 0; j < list.size(); j ++) { if(list.get(j).getTtime()<=sum) { list1.add(list.get(j)); } }for(int j = 0; j < list1.size()-1; j ++) { for(int k = 0; k list,int i,int j){ final List l=list; l.set(i, l.set(j, l.get(i))); } }





代码如下:
package com.eternally.dfs; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; /** * HRRN算法 * @author Administrator * */ class Pcb implements Comparable{ public String name; public float ttime; public float needtime; public Pcb(String name, float ttime, float needtime) { this.name = name; this.ttime = ttime; this.needtime = needtime; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getTtime() { return ttime; } public void setTtime(float ttime) { this.ttime = ttime; } public float getNeedtime() { return needtime; } public void setNeedtime(float needtime) { this.needtime = needtime; } @Override public int compareTo(Pcb o) { if(this.ttime>o.ttime) { return 1; } return -1; }} public class Test2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); String name; float ttime; float needtime; List list = new ArrayList<>(); for(int i = 0; i < n; i ++) { name=in.next(); ttime=in.nextFloat(); needtime=in.nextFloat(); Pcb pcb = new Pcb(name, ttime, needtime); list.add(pcb); } Collections.sort(list); System.out.println("作业号提交时间所需时间开始时间完成时间"); float sum=list.get(0).ttime; List list2 = new ArrayList<>(); float sum1=0; for(int i = 0; i(); for(int j = 0; j < list.size(); j ++) { if(list.get(j).getTtime()<=sum) { list1.add(list.get(j)); } }for(int j = 0; j < list1.size()-1; j ++) { for(int k = 0; k list,int i,int j){ final List l=list; l.set(i, l.set(j, l.get(i))); } }


    推荐阅读