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

作業系統- 實驗二 模擬處理機排程的SJF排程演算法(Java實現)

                                                      實驗二 模擬處理機排程的SJF排程演算法

一、實驗目的:用c++模擬SJF排程演算法(短作業優先)

二、實驗內容:本實驗首先輸入程序的個數,然後輸入程序名稱,最後輸入每個程序提交到系統的時間和每個程序所需要的處理時間。然後通過模擬程式,顯示以下資訊:

1)處理機對程序的排程過程。

2)計算這N個程序的平均週轉時間。

注意:

  1. 作業在執行過程中不能搶斷,只有作業執行完畢才能允許其它作業執行。
  2. 如果兩個作業的處理時間相等,則提交時間早的優先執行。

三、示例  

輸入:

4

A  0.1   5

B  0.1   3

C  2    3

D  5    8

輸出:

測試資料:

 

解題思路:

首先進行根據提交時間排序一下,然後依次根據程序數來選擇遍歷次數

初始化當前時間為最先到達記憶體的程序的提交時間

然後判斷在這個時間點有哪些任務已經到達記憶體,依次放入另外一個集合

對這個集合進行所需時間排序,需要時間最少的先執行,其次如果需要時間相等,就根據兩者的到達時間最小的先執行,執行結束後當前時間為當前時間加上這個程序的所需時間

然後再判斷在這個時間點有哪些任務已經到達記憶體,依次放入另外一個集合
 

 

package com.eternally.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;





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 Test {

    public static void main(String[] args) {
	List<String> list12=new ArrayList<>();
	Iterator iterator =list12.iterator();
	
	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(list1.get(k).getNeedtime()>list1.get(k+1).needtime) {
		       swap(list1, k, k+1);
		   }else if(list1.get(k).getNeedtime()==list1.get(k+1).needtime&&list1.get(k).getTtime()>list1.get(k+1).getTtime()) {
		       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)));
    }
	
}