- 作業系統教程
- 作業系統 - 首頁
- 作業系統 - 需求
- 作業系統 - 概述
- 作業系統 - 歷史
- 作業系統 - 組成部分
- 作業系統 - 結構
- 作業系統 - 架構
- 作業系統 - 服務
- 作業系統 - 屬性
- 作業系統 - 週轉時間 & 等待時間
- 作業系統程序
- 作業系統 - 程序
- 作業系統 - 程序排程
- 作業系統 - 排程演算法
- 先來先服務 (FCFS) 排程演算法
- 最短作業優先 (SJF) 排程演算法
- 輪詢 (Round Robin) 排程演算法
- 最高響應比優先 (HRRN) 排程演算法
- 優先順序排程演算法
- 多級佇列排程
- 上下文切換
- 程序操作
- 彩票程序排程
- 預測 SJF 排程演算法的突發時間
- 競爭條件漏洞
- 臨界區同步
- 互斥同步
- 程序控制塊
- 程序間通訊
- 搶佔式和非搶佔式排程
- 作業系統同步
- 程序同步
- 作業系統記憶體管理
- 作業系統 - 記憶體管理
- 作業系統 - 虛擬記憶體
- 作業系統儲存管理
- 作業系統 - 檔案系統
- 作業系統型別
- 作業系統 - 型別
- 作業系統雜項
- 作業系統 - 多執行緒
- 作業系統 - I/O 硬體
- 作業系統 - I/O 軟體
- 作業系統 - 安全性
- 作業系統 - Linux
- 考試題庫及答案
- 考試題庫及答案
- 作業系統常用資源
- 作業系統 - 快速指南
- 作業系統 - 常用資源
- 作業系統 - 討論
最短作業優先 (SJF) 排程演算法
CPU排程策略是一種選擇一個處於等待狀態的程序並將其分配給CPU以便執行的過程。存在多種排程演算法。在本節中,我們將學習最短作業優先 (SJF) 排程演算法。
SJF(最短作業優先)排程演算法
在最短作業優先排程演算法中,程序按其CPU突發時間的升序進行排程,即CPU分配給執行時間最短的程序。
SJF 排程演算法的變體
SJF 排程演算法有兩個變體:
非搶佔式 SJF 排程
在非搶佔式版本中,一旦一個程序被分配給CPU,它就會一直執行到完成。在此,當一個程序完成執行或當一個或多個新程序到達空的準備佇列時,就會呼叫短期排程程式。
搶佔式 SJF 排程
這是 SJF 排程的搶佔式版本,也稱為最短剩餘時間優先 (SRTF) 排程演算法。在這裡,如果在較長程序執行期間,較短程序進入準備佇列,則會發生程序切換,即將正在執行的程序交換到準備佇列,而新到達的較短程序開始執行。因此,短期排程程式在系統中到達新的程序或現有程序完成執行時被呼叫。
SJF 演算法的特性
- SJF 將 CPU 分配給執行時間最短的程序。
- 如果兩個或多個程序具有相同的突發時間,則根據先到先服務原則在這幾個程序之間進行仲裁。
- 存在搶佔式和非搶佔式版本。
- 它最大限度地減少了程序的平均等待時間。
- 如果短程序持續進入系統,則可能會導致長程序飢餓。
我們可以透過以下示例瞭解這兩種排程策略的工作原理。
非搶佔式 SJF 演算法示例
示例 1
假設我們有一組四個程序同時到達,順序為 P1、P2、P3 和 P4。每個程序的突發時間(毫秒)如下表所示:
| 程序 | CPU 突發時間 (ms) |
|---|---|
| P1 | 6 |
| 8 | 10 |
| P2 | 4 |
| 20 | 6 |
P3
4
P4
8
讓我們繪製甘特圖,並使用非搶佔式 SJF 演算法找到平均週轉時間和平均等待時間。
使用 SJF 的程序集的甘特圖
程序 P3 的突發時間最短,因此它首先執行。然後我們發現 P1 和 P4 的突發時間相同,均為 8ms。由於 P1 先到達,因此 CPU 分配給 P1,然後分配給 P4。最後執行 P2。因此,執行順序為 P3、P1、P4、P2,如下面的甘特圖所示:
讓我們根據上圖計算平均週轉時間和平均等待時間。
平均週轉時間
= 各程序週轉時間之和 / 程序數
= (TATP1 + TATP2 + TATP3 + TATP4) / 4
= (12 + 36 + 4 + 20) / 4 = 18 ms
平均等待時間
= 各程序等待時間之和 / 程序數
| 程序 | = (WTP1 + WTP2 + WTP3 + WTP4) / 4 | = (8 + 28 + 0 + 12) / 4 = 12 ms |
|---|---|---|
| P1 | 0 | 6 |
| 8 | 4 | 10 |
| P2 | 4 | 4 |
| 20 | 8 | 3 |
P3
示例 2
在前面的示例中,我們假設所有程序同時到達,這在實踐中是不可能的。在這裡,我們考慮程序在不同時間到達的情況。假設我們有一組四個程序,其到達時間和 CPU 突發時間如下:
到達時間
CPU 突發時間
甘特圖
在繪製甘特圖時,我們將考慮在呼叫排程程式時系統中到達了哪些程序。在 0ms 時,只有 P1 存在,因此它被分配給 CPU。P1 在 6ms 完成執行,此時 P2 和 P3 已到達,但 P4 尚未到達。P3 被分配給 CPU,因為在當前程序中它具有最短的突發時間。P3 在 10ms 完成執行。到那時,P4 已到達,因此在程序 P2 和 P4 上執行 SJF 演算法。因此,我們發現執行順序為 P1、P3、P4、P2,如下面的甘特圖所示:
讓我們計算每個程序的週轉時間,並計算平均值。
程序的週轉時間 = 完成時間 - 到達時間
讓我們繪製甘特圖,並使用非搶佔式 SJF 演算法找到平均週轉時間和平均等待時間。
TATP1 = CTP1 - ATP1 = 6 - 0 = 6 ms
TATP2 = CTP2 - ATP2 = 23 - 4 = 19 ms
TATP3 = CTP3 - ATP3 = 10 - 4 = 6 ms
TATP4 = CTP4 - ATP4 = 13 - 8 = 5 ms
= 各程序週轉時間之和 / 程序數
= (6 + 19 + 6 + 5) / 4 = 9 ms
等待時間由每個程序在準備佇列中等待的時間給出。對於非搶佔式排程演算法,每個程序的等待時間可以簡單地計算為:
任何程序的等待時間 = CPU 接納時間 - 到達時間
平均週轉時間
WTP1 = 0 - 0 = 0 ms
= (TATP1 + TATP2 + TATP3 + TATP4) / 4
WTP2 = 13 - 4 = 9 ms
WTP3 = 6 - 4 = 2 ms
WTP4 = 10 - 8 = 2 ms
| 程序 | = (WTP1 + WTP2 + WTP3 + WTP4) / 4 | = (8 + 28 + 0 + 12) / 4 = 12 ms |
|---|---|---|
| P1 | 0 | 8 |
| 8 | 4 | 10 |
| P2 | 4 | 3 |
| 20 | 10 | 4 |
示例 2
= 各程序等待時間之和 / 程序數
= (0 + 9 + 2 + 2) / 4 = 3.25 ms
搶佔式 SJF (SRTF) 演算法示例
讓我們繪製甘特圖,並使用非搶佔式 SJF 演算法找到平均週轉時間和平均等待時間。
TATP1 = CTP1 - ATP1 = 6 - 0 = 6 ms
程序 P3 的突發時間最短,因此它首先執行。然後我們發現 P1 和 P4 的突發時間相同,均為 8ms。由於 P1 先到達,因此 CPU 分配給 P1,然後分配給 P4。最後執行 P2。因此,執行順序為 P3、P1、P4、P2,如下面的甘特圖所示:
現在讓我們對以下程序執行搶佔式 SJF (SRTN) 排程,繪製甘特圖並找到平均週轉時間和平均等待時間。
平均週轉時間
WTP1 = 0 - 0 = 0 ms
= (TATP1 + TATP2 + TATP3 + TATP4) / 4
由於這是一個搶佔式排程演算法,因此當程序到達和完成執行時都會呼叫排程程式。排程程式計算系統中每個程序的剩餘完成時間,並選擇剩餘執行時間最短的程序。
最初,只有 P1 到達,因此它被分配給 CPU。在 4ms 時,P2 和 P3 到達。排程程式計算程序 P1、P2 和 P3 的剩餘時間為 4ms、10ms 和 3ms。由於 P3 的時間最短,因此 P1 被 P3 搶佔。P3 在 7ms 完成執行,並呼叫排程程式。在系統中的程序中,P1 的時間最短,因此它繼續執行。在 10ms 時,P4 到達,排程程式再次計算每個程序的剩餘時間。由於 P1 的剩餘時間最短,因此不發生程序切換,P1 繼續執行。以類似的方式,其餘程序完成執行。
- 根據甘特圖,我們計算平均週轉時間和平均等待時間。
- = ((11 - 0) + (25 - 4) + (7 - 4) + (15 - 10)) / 4 = 10 ms
- = (3 + 11 + 0 + 1) / 4 = 3.75 ms
SJF 演算法的優點
- 與 FCFS 排程相比,在搶佔式和非搶佔式方法中,SJF 的平均等待時間都大大減少。
- SJF 在相當程度上優化了週轉時間。
- 如果精確估計每個程序的執行時間,它可以保證最大吞吐量。
SJF 演算法的缺點
如果存在具有較短突發時間的程序流,則系統中的較長程序可能會無限期地等待在準備佇列中,從而導致飢餓。
