| 進程 | 到達時間 | 服務時間 |
|---|---|---|
| P1 | 0 | 1 |
| P2 | 3 | 3 |
| P3 | 3 | 2 |
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 動態維護就緒隊列,處理到達事件與完成事件驅動。
SJF 是理解「優先隊列驅動調度」的入門模型,操作系統課程與雲資源調度器核心邏輯同源。