实验三模拟处理机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
五、运行结果
文章图片
文章图片
背景: 这是我们操作系统课程的一道实验题
做这道题,我只花了打算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)));
}
}