先來先服務的調度算法:最簡單的調度算法,既可以用於作業調度 ,也可以用於程序調度,當作業調度中采用該算法時,系統將按照作業到達的先后次序來進行調度,優先從后備隊列中,選擇一個或多個位於隊列頭部的作業,把他們調入內存,分配所需資源、創建進程,然后放入“就緒隊列”,直到該進程運行到完成或發生某事件堵塞后,進程調度程序才將處理機分配給其他進程。
算法的運用:
算法程序編寫大致思路:對到達系統時間進行排序,依次設置其值。具體還是看備注吧~
JAVA實現如下:
工程目錄:
FCFS類
package FCFS;
public class FCFS {
//TAG是FCFS類的名字
private final String TAG = FCFS.class.getSimpleName();
/**FCFS先來先服務算法*/
public int execute(ProcessFCFSModel[] processList) {
//如果進程對象為空或其長度為零則出錯
if (processList == null || processList.length == 0) {
System.out.println(TAG + ">數據為空");
return -1;
}
ProcessFCFSModel[] fcfsModels = processList;
int runTimeSum = 0;
//按照到達時間進行排序
mysort(fcfsModels);
//將進程對象進行遍歷
for (ProcessFCFSModel model : fcfsModels) {
//如果總時間小於進程到達的時間,總時間變為該進程到來的時間:
if (runTimeSum < model.getComingTime()) {
runTimeSum = (int)model.getComingTime();
}
//將總時間設置為進程開始執行的時間
model.setStartRunTime(runTimeSum);
//該進程運行后的總時間
runTimeSum += model.getRunTime();
//設置該進程結束的時間
model.setFinishTime(runTimeSum);
//設置該進程的周轉時間
model.setTurnaroundTime(runTimeSum - model.getComingTime());
}
return runTimeSum;
}
/**選擇排序*/
public ProcessFCFSModel[] mysort(ProcessFCFSModel[] processList){
ProcessFCFSModel temp;
for(int i=0;i<processList.length;i++){
for(int j=i+1;j<processList.length;j++){
if(processList[i].getComingTime()>processList[j].getComingTime()){
temp = processList[i];
processList[i] = processList[j];
processList[j] = temp;
}
}
}
return processList;
}
}
ProcessFCFSModel類
package FCFS;
/**
* FCFS的進程對象擁有的屬性
*/
public class ProcessFCFSModel{
private String processId; // 進程標識
private long runTime; // 進程完整執行預計的時間
private long comingTime; // 到達時間
private long startRunTime; // 開始執行時間
private long finishTime; // 完成時間
private long turnaroundTime; // 周轉時間
public ProcessFCFSModel(String processId, long runTime, long comingTime) {
this.processId = processId;
this.runTime = runTime;
this.comingTime = comingTime;
}
/**getter and setter*/
public long getComingTime() {
return comingTime;
}
public long getStartRunTime() {
return startRunTime;
}
public void setStartRunTime(long startRunTime) {
this.startRunTime = startRunTime;
}
public long getFinishTime() {
return finishTime;
}
public void setFinishTime(long finishTime) {
this.finishTime = finishTime;
}
public long getTurnaroundTime() {
return turnaroundTime;
}
public void setTurnaroundTime(long turnaroundTime) {
this.turnaroundTime = turnaroundTime;
}
public String getProcessId() {
return processId;
}
public long getRunTime() {
return runTime;
}
}
ProcessNumber類
package FCFS;
/**
*
*/
public class ProcessNumber {
public static ProcessFCFSModel[] getFCFSModelArray() {
/**自定義進程數量*/
int processnumber=4;
ProcessFCFSModel[] models = new ProcessFCFSModel[processnumber];
models[0] = new ProcessFCFSModel("A", 4, 0);
models[1] = new ProcessFCFSModel("B", 3, 1);
models[2] = new ProcessFCFSModel("C", 5, 100);
models[3] = new ProcessFCFSModel("D", 2, 3);
return models;
}
}
TestFCFS類
package FCFS;
/**
* 測試類
*/
public class TestFCFS {
public static void main(String[] args) {
TestFCFS schedule = new TestFCFS();
schedule.testFCFS();
System.out.println("---------------------------------------------------------------------------------");
}
private void testFCFS() {
/**進行FCFS算法進程調度*/
FCFS fcfs = new FCFS();
ProcessFCFSModel[] processArray = ProcessNumber.getFCFSModelArray();//創建進程
int timeSum = fcfs.execute(processArray);//總運行時間
int turnaroundSum = 0;//周轉時間
/**打印結果*/
System.out.println("進程調度過程:\n進程名\t到達時間\t服務時間\t開始時間\t完成時間\t周轉時間");
for (ProcessFCFSModel process : processArray) {
turnaroundSum += process.getTurnaroundTime();
System.out.println(process.getProcessId() + "\t\t" +
process.getComingTime() + "\t\t" + process.getRunTime() + "\t\t" +
process.getStartRunTime() + "\t\t" + process.getFinishTime() + "\t\t" +
process.getTurnaroundTime() + "\t\t");
}
System.out.println("FCFS總運行時間:" + timeSum + "(ms)");
System.out.println("平均周轉時間:" + String.format("%.2f", 1.0*(turnaroundSum / processArray.length)));
}
}
運行結果:
emmm這里沒有帶權周轉。。不過加進去也很簡單,自行加就好啦。