Linux操作系統作為一個開源且廣泛應用的操作系統,其內核設計包含了許多核心功能,而進程調度器(Scheduler)就是其中一個至關重要的模塊。進程調度器負責決定在任何給定的時刻哪個進程可以運行,以及其運行的順序。這篇文章將詳細探討Linux進程調度器的工作原理、主要算法、調度策略以及其在實際操作中的應用。
進程調度是指操作系統決定在多道程序環境下如何分配CPU時間給多個進程或線程的過程。在一個現代操作系統中,通常有多個進程或線程需要執行,但是CPU的核心數量有限,因此需要通過調度來合理分配這些有限的計算資源。Linux進程調度的目標包括以下幾個方面:
響應時間:保證交互式進程有良好的響應時間。
吞吐量:盡可能多地完成任務,提高系統的整體吞吐量。
公平性:確保所有進程都有機會獲得CPU時間,避免饑餓現象。
實時性:對于實時系統,調度器應能確保實時任務在其時間約束內完成。
為達到以上目標,Linux按照調度的優先級,分別實現了DEADLINE調度策略、實時(RT)調度策略、完全公平調度策略等。
圖1 Linux調度策略的優先次序
如圖1所示[1],Linux在調度過程中首先嘗試在最高級別的策略模塊中尋找調度實體(即進程),如果沒找到,則到下一級的策略模塊中尋找,如果都沒找到,則進入idle狀態。例如,Linux內核如果在DEADLINE策略模塊中找到了調度實體,就會在處理器上調度運行該實體,而不會繼續到RT調度策略模塊中尋找。接下來分節介紹Linux中最常用的DEADLINE、RT以及完全公平調度策略模塊,又稱調度器。
DEADLINE調度器
Linux內核中的DEADLINE調度器是一種實時調度策略,旨在滿足具有嚴格時間要求的實時任務的需求。它在設計上結合了EDF(Earliest Deadline First)和CBS(Constant Bandwidth Server)兩種經典的實時調度算法,為實時應用程序提供了更可靠和可預測的執行環境。
Linux DEADLINE調度器是Linux內核自3.14版本以來引入的調度策略,其目的是為實時任務提供精確的時間控制和調度保證。DEADLINE調度器通過為每個任務分配三個關鍵參數——開始時間(Start Time)、截止時間(Deadline)和運行時間(Runtime),來確定任務的執行順序和調度行為。
調度器的目標是在任務的截止時間到達之前,完成所有具有時間約束的任務。如果任務沒有在截止時間前完成,通常會被視為任務失敗或延遲,這在硬實時系統中是不可接受的。
DEADLINE調度器基于EDF(Earliest Deadline First)的思想,即在系統中,優先選擇截止時間最早的任務執行。此外,結合CBS(Constant Bandwidth Server)機制,DEADLINE調度器還能控制任務的CPU時間消耗,防止任務因超出分配的時間片而影響系統的整體實時性能。
Linux DEADLINE調度器的主要應用場景是硬實時系統,如工業控制系統、機器人控制、航空航天等領域,這些系統對任務的時間精度要求非常高,任務的延遲或未按時完成會導致嚴重的后果。通過DEADLINE調度器,系統可以確保任務在其指定的截止時間內完成。多媒體應用,如音頻和視頻流處理,要求任務以固定的周期執行,并在特定時間內完成,以保證輸出的連續性和質量。DEADLINE調度器可以幫助這些任務獲得所需的CPU時間,從而避免丟幀或音視頻不同步的問題。以及高精度定時任務,如在金融交易系統、科學計算、醫療設備等場景中,高精度的定時任務非常重要。DEADLINE調度器能夠確保這些任務按預定時間精確執行,滿足系統的嚴格要求。
DEADLINE調度器的缺點是相比于普通調度器,DEADLINE調度器的配置參數較多,需要用戶對任務的時間需求有詳細了解,這對應用開發者提出了更高的要求。另外,DEADLINE調度器需要系統有足夠的資源來滿足實時任務的要求,當任務過多或系統資源有限時,可能會出現任務調度失敗的情況。最后,DEADLINE調度器缺乏彈性,在負載非常動態的系統中,DEADLINE調度器可能不如CFS等調度器靈活,因為它嚴格依賴于預先設定的時間參數。
RT調度器
RT調度器是Linux內核中專門為實時任務設計的調度器,它為那些對延遲敏感的任務提供了更高的調度優先級,以確保它們能夠在預定時間內執行。Linux中主要有兩種RT調度策略:SCHED_FIFO 和 SCHED_RR,它們都是基于優先級的調度策略,與普通調度策略相比,RT調度策略提供了更嚴格的時間保證。
SCHED_FIFO(First In, First Out):這是一個簡單的實時調度策略,任務按優先級排序,優先級相同的任務按到達順序執行。SCHED_FIFO任務一旦獲得CPU資源,將持續運行,直到任務主動讓出CPU或被更高優先級的任務搶占。沒有時間片的概念,這意味著低優先級的任務可能會被高優先級任務“餓死”。
SCHED_RR(Round-Robin):SCHED_RR與SCHED_FIFO類似,但它在相同優先級的任務之間實現了時間片輪轉。每個任務在獲得CPU時會運行一個時間片(默認100ms),然后讓位給同一優先級的下一個任務。這樣可以防止同一優先級的任務發生饑餓現象。
RT調度器具有嚴格的優先級控制,RT調度策略減少了調度延遲,保證了任務在規定時間內獲得CPU資源。在需要高可靠性和時間精度的場景中,RT調度器提供了比普通調度器更高的穩定性和可預測性。
RT調度器的缺點是高優先級的RT任務可能長期占用CPU,導致低優先級任務得不到執行,甚至可能導致系統不響應(例如,一個SCHED_FIFO任務如果沒有主動釋放CPU,系統將無法響應其他任務)。另外RT調度器配置復雜,配置復雜:合理配置RT調度器的優先級和時間片需要深入了解任務的時間需求,配置不當可能導致系統不穩定或性能下降。RT調度器對資源的占用較為剛性,在動態負載環境下可能表現不佳。
完全公平調度器
Linux內核的完全公平調度器(Completely Fair Scheduler, CFS)是目前Linux系統中默認的進程調度器,它旨在提供一個公平、可擴展且高效的調度機制。CFS調度器的設計理念是盡量公平地分配CPU時間,使得每個任務都能獲得與其優先級相符的CPU時間份額。
在CFS中,公平的概念體現在所有任務都應該在相同優先級的情況下,獲得相等的CPU時間份額。CFS通過維護每個任務的“虛擬運行時間”來實現這一點。任務的虛擬運行時間越少,意味著它獲得的CPU時間越少,因此CFS會優先調度虛擬運行時間較少的任務,以實現CPU時間的公平分配。
CFS使用紅黑樹(Red-Black Tree)數據結構來管理所有可運行的任務。紅黑樹是一種自平衡二叉搜索樹,能夠在O(log N)時間內插入、刪除和查找元素。CFS將所有任務按其虛擬運行時間排序存儲在紅黑樹中,每次調度時,選擇樹中最左邊(虛擬運行時間最少)的任務來運行。
最后,CFS調度器與cgroups(Control Groups)緊密結合,允許管理員對任務組設置CPU資源的配額。通過cgroups,系統管理員可以將進程劃分為不同的組,并為每個組分配CPU時間份額,從而實現更精細的資源控制。
圖2 Linux完全公平調度策略與Cgroup的進程組的結合
如圖2所示,與Cgroup結合后,Linux完全公平調度的實體,按照調度任務組形成了一個樹狀結構。在進行調度實體選擇時,調度器首先從樹的根結點(與處理器直接對應的調度組),逐層選取最佳調度實體,一直到葉子結點(與具體進程對應)。
望獲自適應調度器
最后簡單介紹一下,國科環宇在研的望獲自適應調度器。該調度器針對Linux實時調度器配置和運行不夠靈活的缺點,對進程的行為進行在線分析,并利用機器學習的方法對進程的調度進行配置,以做到實時性和靈活性的兼顧。
?可點擊進入望獲實時Linux官網試用:
https://www.onewos.com/
參考文獻
[1] Digging into the Linux scheduler
http:// https://deepdives.medium.com/digging-into-linux-scheduler-47a32ad5a0a8
審核編輯 黃宇
-
Linux
+關注
關注
87文章
11090瀏覽量
207596 -
進程調度器
+關注
關注
0文章
3瀏覽量
1347
發布評論請先 登錄
相關推薦
評論