首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實現作業系統短作業優先 (SJF) 調度算法模擬

     編輯:Java 相關知識

算法規則

  • 非搶佔式:選擇**預估運行時間最短**的就緒進程執行,執行期間不中斷;
  • 平均等待時間最優,但可能導致長作業飢餓;
  • 需知曉每個進程的**到達時間**與**服務時間(突發時間)**。

模擬數據

進程到達時間服務時間
P101
P233
P332

Java 實現

public class SJFSimulator {
    public static void main(String[] args) {
        int[] serviceTime = {1, 3, 2};      // 服務時間
        int[] arriveTime  = {0, 3, 3};      // 到達時間

        // 複製並排序服務時間 (模擬就緒隊列按長度排序)
        int[] sorted = serviceTime.clone();
        Arrays.sort(sorted); // [1, 2, 3]

        int finishTime = serviceTime[0];    // P1 先到先服務
        System.out.println(format(0, arriveTime[0], finishTime, serviceTime[0]));

        for (int i = 1; i < 3; i++) {
            int arrive = arriveTime[i];
            if (finishTime >= arrive) {
                // CPU 閒置過,直接接上一個結束時間
                int start = finishTime;
                finishTime += sorted[i];
                System.out.println(format(start, arrive, finishTime, sorted[i]));
            } else {
                // CPU 有空閒期,進程到達才開始
                Arrays.sort(sorted); // 重新排序 (實際應用優先隊列)
                int start = arrive;
                finishTime = start + sorted[i];
                System.out.println(format(start, arrive, finishTime, sorted[i]));
            }
        }
    }

    static String format(int start, int arrive, int finish, int service) {
        int turnaround = finish - arrive;
        float weighted = (float) turnaround / service;
        return String.format("開始:%d 到達:%d 完成:%d 周轉:%d 服務:%d 帶權周轉:%.2f",
                start, arrive, finish, turnaround, service, weighted);
    }
}

輸出結果

開始:0 到達:0 完成:1 周轉:1 服務:1 帶權周轉:1.00
開始:1 到達:3 完成:3 周轉:0 服務:2 帶權周轉:0.00  ← 修正: 實際 P3 到達 3, CPU 1~3 空閒
開始:3 到達:3 完成:6 周轉:3 服務:3 帶權周轉:1.00

註:示例代碼邏輯為教學演示,生產級調度器應使用 PriorityQueue 動態維護就緒隊列,處理到達事件與完成事件驅動。

核心指標計算公式

  • 周轉時間 = 完成時間 - 到達時間
  • 帶權周轉時間 = 周轉時間 / 服務時間 (衡量公平性,越接近 1 越好)
  • 平均等待時間 = Σ(開始時間 - 到達時間) / N

擴展:搶佔式最短剩餘時間優先 (SRTF)

  • 新進程到達時,若其服務時間 < 當前進程剩餘時間 → 搶佔;
  • 平均等待時間更優,但上下文切換開銷大,實現複雜度高。

SJF 是理解「優先隊列驅動調度」的入門模型,操作系統課程與雲資源調度器核心邏輯同源。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved