作業系統-實驗三 模擬處理機HRRN排程演算法(Java實現)
實驗三 模擬處理機HRRN排程演算法
一、實驗目的:用c,c++,java設計HRRN排程演算法程式。
二、實驗內容:本實驗隨機輸入的程序個數、程序名稱、程序提交到系統的時間、程序執行所需時間。通過模擬程式。顯示以下資訊:
1)處理機對程序的排程過程。
2)計算這N個程序的平均週轉時間。
三、HRRN(最高響應比排程演算法)原理
最高響應比排程:在每次排程作業時,先計算後備隊中每個作業的響應比,然後挑選響應比高者投入執行。
響應比R定義:
R=(w+S)/S
(R:響應比,W=等待時間,S=執行時間)
響應比R= 週轉時間 / 執行時間
=(執行時間 + 等待時間)/ 執行時間
= 1 +(等待時間 / 執行時間)
四、示例
如:輸入
程序個數:5
程序名稱 到達系統時間 所需服務時間
A 0 3
B 2 6
C 4 4
D 6 5
E 8 2
顯示執行結果:
程序名稱 到達系統時間 所需服務時間 開始時間 結束時間
A 0 3 0 3
B 2 6 3 9
C 4 4 9 13
E 8 2 13 15
D 6 5 15 20
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<Pcb> 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<Float> list2 = new ArrayList<>();
float sum1=0;
for(int i = 0;i<n;i ++) {
List<Pcb> list1=new ArrayList<>();
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<list1.size()-1-j;k++) {
if((sum-list1.get(k).getTtime())/list1.get(k).getNeedtime()<(sum-list1.get(k+1).getTtime())/list1.get(k+1).getNeedtime()) {
swap(list1, k, k+1);
}
}
}
list.remove((Pcb)list1.get(0));
System.out.println(list1.get(0).getName()+" "+list1.get(0).getTtime()+" "+list1.get(0).getNeedtime()+" "+sum+" "+(sum+list1.get(0).getNeedtime()));
sum+=list1.get(0).getNeedtime();
sum1=sum1+sum-list1.get(0).getTtime();
}
System.out.println("平均週轉時間為"+String.format("%.2f", sum1/n));
}
public static void swap(List<?> 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<Pcb>{
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<Pcb> 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<Float> list2 = new ArrayList<>();
float sum1=0;
for(int i = 0;i<n;i ++) {
List<Pcb> list1=new ArrayList<>();
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<list1.size()-1-j;k++) {
if((sum-list1.get(k).getTtime())/list1.get(k).getNeedtime()<(sum-list1.get(k+1).getTtime())/list1.get(k+1).getNeedtime()) {
swap(list1, k, k+1);
}
}
}
list.remove((Pcb)list1.get(0));
System.out.println(list1.get(0).getName()+" "+list1.get(0).getTtime()+" "+list1.get(0).getNeedtime()+" "+sum+" "+(sum+list1.get(0).getNeedtime()));
sum+=list1.get(0).getNeedtime();
sum1=sum1+sum-list1.get(0).getTtime();
}
System.out.println("平均週轉時間為"+String.format("%.2f", sum1/n));
}
public static void swap(List<?> list,int i,int j){
final List l=list;
l.set(i, l.set(j, l.get(i)));
}
}