1. 程式人生 > >作業系統-實驗三 模擬處理機HRRN排程演算法(Java實現)

作業系統-實驗三 模擬處理機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)));
	    }
}