程序排程演算法決定了程序在何時、以何種順序被分配到 CPU 上執行。不同的排程演算法適合不同型別的作業系統和應用需求,以下是一些常用的程序排程演算法:
1. 先來先服務排程(FCFS: First-Come, First-Served)
- 演算法原理:按程序到達的先後順序分配 CPU,先到達的程序先被處理。
- 優點:簡單易實現,公平性好。
- 缺點:可能導致“飢餓”問題,即後來的短任務可能要等待很長時間,導致平均等待時間較長。
- 適用場景:適合需要簡單管理的系統,但不適用於需要快速響應的實時系統。
2. 短作業優先排程(SJF: Shortest Job First)
- 演算法原理:選擇估計執行時間最短的程序先執行,可以是非搶佔式或搶佔式。
- 優點:在理想情況下可實現最小的平均等待時間。
- 缺點:無法準確預測程序的執行時間(尤其是動態任務);可能導致長作業“飢餓”。
- 適用場景:適合批處理系統,適用於已知任務長度的情況。
3. 最短剩餘時間優先(SRTF: Shortest Remaining Time First)
- 演算法原理:這是 SJF 的搶佔式版本。每次有新程序到達時,若新程序的剩餘時間短於當前程序,則搶佔當前程序。
- 優點:能進一步減少平均等待時間。
- 缺點:實時性差,長任務可能長期等待。
- 適用場景:與 SJF 類似,適合批處理系統。
( 短作業優先 =》減少平均等待時間 )
4. 優先順序排程(Priority Scheduling)
- 演算法原理:為每個程序分配一個優先順序,優先順序高的程序優先執行。可以是搶佔式或非搶佔式。如果兩個程序優先順序相同,則採用 FCFS 的方式排程。
- 優點:能保證高優先順序任務及時執行。
- 缺點:可能出現“優先順序反轉”(低優先順序程序佔用資源,導致高優先順序程序無法執行)和“飢餓”(長時間得不到排程)問題。透過引入老化機制(逐漸提高長時間等待的程序優先順序)可以緩解飢餓。
- 適用場景:適用於需要根據任務優先順序靈活分配資源的系統,如實時系統。
5. 時間片輪轉排程(Round Robin)
- 演算法原理:為每個程序分配一個固定的時間片,超出時間片則切換到下一個程序,未完成的程序會被放回佇列等待下一次輪到。
- 優點:簡單公平,適合多工系統,能保證每個任務都能得到處理。
- 缺點:時間片長度設定不當可能導致較頻繁的上下文切換,增加了系統開銷;時間片過長又會導致響應變慢。需要根據系統的負載和應用場景來調整,一般在幾毫秒到幾十毫秒之間。
- 適用場景:廣泛應用於分時系統、互動式系統,適合多使用者環境。
6. 多級反饋佇列排程(Multilevel Feedback Queue Scheduling)
- 演算法原理:程序被分配到多個優先順序佇列中,每個佇列有不同的時間片長度和優先順序。優先順序高的佇列時間片較短,優先處理高優先順序佇列的程序。在任務執行過程中,可以動態優先順序調整,即長時間等待的低優先順序程序會被提升到更高的優先順序佇列,以避免長作業飢餓。
- 優點:結合了 短作業優先 和 時間片輪轉 的優點,能夠高效地處理不同型別的任務。它透過根據任務的執行時間動態調整優先順序,可以有效地減少平均等待時間,同時避免長時間的任務阻塞短任務。
- 缺點:演算法複雜,管理多個佇列需要額外開銷。
- 適用場景:適用於需要處理不同型別任務的系統,尤其是需要高響應速度和公平性的作業系統。
7. 實時排程演算法
實時系統中需要特殊的排程演算法,以確保任務在特定時間完成。以下是常見的實時排程演算法:
- 最早截止時間優先(EDF: Earliest Deadline First):優先執行最接近截止時間的任務,適用於動態優先順序實時系統。
- 最低鬆弛時間優先(LST: Least Slack Time):計算任務的鬆弛時間(截止時間減去剩餘執行時間),選擇鬆弛時間最小的任務執行。
這些實時排程演算法保證了系統在特定時間內完成高優先順序任務,適合控制系統和嵌入式系統等需要精確時序控制的場景。
擴充:
現代作業系統通常會根據實際需求,將多種排程演算法結合起來使用,以實現最佳的效能和響應速度。例如,Windows 和 Linux 中使用的排程演算法結合了優先順序、時間片輪轉和多級反饋佇列,以適應不同型別的任務和使用者需求。
1). Windows 作業系統的排程演算法
Windows 的排程演算法基於優先順序排程和多級反饋佇列,同時結合了搶佔式排程。Windows 中將程序分為不同優先順序級別,從 0 到 31,其中:
- 0 級用於系統空閒程序(Idle Process),
- 1 到 15 級用於普通程序(普通使用者程序),
- 16 到 31 級用於實時程序(Real-Time Processes)。
Windows 排程演算法的關鍵特點
-
優先順序排程:
- Windows 會根據程序的優先順序來進行排程,高優先順序的程序優先獲得 CPU。優先順序包括 靜態優先順序 和 動態優先順序,動態優先順序在程序執行過程中可能會發生調整,例如長時間沒有獲得 CPU 的低優先順序程序會被提升優先順序,以避免飢餓現象。
-
搶佔式排程:
- 如果一個高優先順序程序準備執行,那麼作業系統會立即中斷當前低優先順序程序的執行,並將 CPU 資源分配給高優先順序程序。
-
時間片輪轉排程:
- Windows 為普通優先順序的程序分配了固定長度的時間片(時間片長度基於系統的設定和程序的優先順序)。在同一優先順序的程序間,採用時間片輪轉方式來保證公平性。實時程序則不會被時間片輪轉機制影響。
-
多級反饋佇列:
- Windows 的排程器使用多級反饋佇列,使系統能靈活管理不同型別的程序,並保證高優先順序程序的快速響應。
排程演算法的應用場景
Windows 的排程演算法設計適合桌面環境和互動式系統,確保高優先順序任務快速響應,使用者操作流暢,同時可以保證普通應用的並行執行。對於實時任務,例如某些驅動程式和系統服務,高優先順序可確保其在需要時立即得到 CPU 資源。
2). Linux 作業系統的排程演算法
Linux 的排程演算法發展經歷了多個版本,不同版本的排程演算法特性有所不同。目前,Linux 採用的是基於完全公平排程器(CFS, Completely Fair Scheduler)演算法,並結合了優先順序和搶佔式排程特性。
Linux 排程演算法的關鍵特點
-
完全公平排程器 (CFS):
- CFS 的核心思想是分時公平,即每個程序都能夠公平地獲得 CPU 時間。CFS 採用一個 紅黑樹 資料結構來組織程序,紅黑樹中的節點按照程序的 虛擬執行時間 排序。CFS 會優先排程虛擬執行時間最少的程序,保證每個程序能夠平等地獲得 CPU 資源。
- CFS 不使用時間片的概念,而是計算每個程序的虛擬執行時間來實現公平排程。虛擬執行時間會受到程序優先順序的影響,優先順序越高的程序,其虛擬執行時間的增加速率越慢,從而優先獲得排程機會。
-
搶佔式排程:
- CFS 支援搶佔式排程,當有優先順序較高或虛擬執行時間較少的程序進入就緒狀態時,作業系統會搶佔當前正在執行的程序。
-
實時排程類:
- 除了普通程序,Linux 還支援 實時程序。實時程序分為 SCHED_FIFO 和 SCHED_RR 兩種排程策略:
- SCHED_FIFO(先進先出排程):實時程序根據優先順序進行排程,優先順序高的先執行,沒有時間片限制。
- SCHED_RR(時間片輪轉排程):在同優先順序的實時程序間輪流分配 CPU 時間片。
- 實時程序的優先順序高於普通程序,在系統資源緊張的情況下,實時程序會優先獲得 CPU 排程。
- 除了普通程序,Linux 還支援 實時程序。實時程序分為 SCHED_FIFO 和 SCHED_RR 兩種排程策略:
排程演算法的應用場景
Linux 的 CFS 適合伺服器環境,其設計目標是確保系統的公平性和高吞吐量,適合長時間執行的任務。在實時性需求較高的場景中,Linux 也提供了實時排程策略,可以保證高優先順序的實時任務得到優先排程。
=》 Windows 與 Linux 排程演算法的對比:
特性 | Windows 排程 | Linux 排程 |
---|---|---|
排程策略 | 優先順序排程、多級反饋佇列 | 完全公平排程 (CFS) + 實時排程 |
優先順序範圍 | 0-31 | 普通優先順序程序 + 實時優先順序程序 |
時間片 | 支援時間片輪轉排程 | CFS 沒有時間片概念,實時程序使用時間片 |
搶佔機制 | 高優先順序任務搶佔低優先順序任務 | 高優先順序任務搶佔低優先順序任務 |
資料結構 | 多級反饋佇列 | 紅黑樹(CFS) |
適用場景 | 桌面環境、互動式應用 | 伺服器環境、高吞吐量、多工併發 |
總結來說,Windows 更側重於互動式使用者體驗的最佳化,強調響應速度;而 Linux 的 CFS 則更加關注任務的公平性和系統的高吞吐量,適合長時間執行的後臺任務。此外,Linux 中的實時排程選項也使其在實時系統中更具靈活性。