java實現FCFS進程調度算法


先來先服務的調度算法:最簡單的調度算法,既可以用於作業調度 ,也可以用於程序調度,當作業調度中采用該算法時,系統將按照作業到達的先后次序來進行調度,優先從后備隊列中,選擇一個或多個位於隊列頭部的作業,把他們調入內存,分配所需資源、創建進程,然后放入“就緒隊列”,直到該進程運行到完成或發生某事件堵塞后,進程調度程序才將處理機分配給其他進程。

算法的運用:

IMG_0076(20200403-222812)

算法程序編寫大致思路:對到達系統時間進行排序,依次設置其值。具體還是看備注吧~

JAVA實現如下:

工程目錄:

1585924456005

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)));
    }
}

運行結果:

1585925112123

emmm這里沒有帶權周轉。。不過加進去也很簡單,自行加就好啦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM