作業系統- 實驗二 模擬處理機排程的SJF排程演算法(Java實現)
阿新 • • 發佈:2018-12-25
實驗二 模擬處理機排程的SJF排程演算法
一、實驗目的:用c++模擬SJF排程演算法(短作業優先)
二、實驗內容:本實驗首先輸入程序的個數,然後輸入程序名稱,最後輸入每個程序提交到系統的時間和每個程序所需要的處理時間。然後通過模擬程式,顯示以下資訊:
1)處理機對程序的排程過程。
2)計算這N個程序的平均週轉時間。
注意:
- 作業在執行過程中不能搶斷,只有作業執行完畢才能允許其它作業執行。
- 如果兩個作業的處理時間相等,則提交時間早的優先執行。
三、示例
輸入:
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))); } }