程序排程 1

2021-10-07 18:41:59 字數 3381 閱讀 3036

最近特別有感觸,各層面的設計似乎都可以從作業系統中找出相似的設計,作業系統幾乎是設計集大成者,所以重新又開始看作業系統相關的書籍。最近可能都是一些記錄性的文章,作業系統原理因為是教學課程,所以不會另做筆記。從重讀linux核心開始,記錄學習過程。

本文均摘自《linux核心與實現》。

因為硬體資源總是有限的,而我們哪個程序可以占用資源投入執行,何時執行以及要執行多長時間,就是排程程式要做的事情。程序排程程式就是可執行態程序之間分配有限的處理器時間資源的核心子系統。

首先我們要明確幾個概念,多工系統可以劃分為:搶占式多工和非搶占式多工。非搶占式多工就是指,除非程序主動停止執行,否則會一直執行。類unix系統都是搶占式多工,由排程程式決定什麼時候停止乙個執行中的程式。這個強制掛起的動作就叫搶占。程序被搶占前執行的時間都是預設好的,叫做時間片。

程序的排程策略決定了何時讓什麼程序來執行,而程序又可以分為i\o消耗密集型和cpu消耗密集型。對於i\o消耗密集型的程序經常要處於執行狀態,但是通常只是執行很短時間,因為他總會等待i\o後又會阻塞。對於cpu消耗密集型程序,通常都是不停的在執行,除非被搶占。

而作業系統為了提高響應速度,cpu消耗密集型程序都常會減少排程頻率,而延長執行時間。所以排程策略會有兩個矛盾點:程序相應速度和最大系統吞吐率。

那麼為了在這兩個矛盾中選擇乙個平衡點,時間片的選定就會很重要。如果時間片過長,會導致系統對與互動程式響應過慢;時間片太短又會程序切換帶來的處理器耗時。但是i\o消耗性程序希望越短的時間片越好,這樣它可以得到快速響應。而cpu消耗性程序則希望越長的時間片越好,他可以持續的執行,提高執行效能(比如快取命中率會更高),減少上下文切換。

在linux中並沒有使用絕對數值的時間片,而是採用了分配了乙個使用比。為了說明為什麼linux採用時間比,我們需要先理解乙個概念,程序優先順序。在linux中程序優先順序分為兩種:

第一種是nice值,範圍是-20到19,預設是0。值越大優先順序越低,值越小優先順序越高。在類unix系統中,nice值是乙個標準化概念,但是不同的作業系統對其的利用方式會有所差別,有的作業系統nice就代表了分配給程序的時間片絕對值。在linux中nice值代表時間片的比例。

第二種是實時優先順序,變化範圍是0到99。值越大優先順序越高。實時程序的優先順序都是高於普通程序的,所以這兩個值是互相不重疊的兩個範疇。

接下來再看時間比例要比時間片的優勢在哪些地方:

1.如果把nice值對映為時間片,那就需要把nice單位值對應到處理器的絕對之間。這樣會導致程序切換無法做到最優。比如nice=0對應的時間片為100ms,nice=20對應的時間片是5ms。假設分別有這兩個nice值的程序處於可執行狀態,那麼對於nice=0的高優先順序程序可以獲得20/21的cpu時間,即105ms中的100ms;而低優先順序的可以獲得1/21的cpu時間,即105ms中的5ms。假設有兩個nice=20的低優先順序程序,每個程序可以獲得50%的cpu時間,但是每個程序每次只能獲得5ms的時間片。也就是說nice=0和nice=20的兩個程序,105ms才進行上下文切換,而兩個nice=20的程序10ms就要上下文切換。同樣兩個高優先順序nice=0的程序同時執行,每個程序也可以獲得50%的cpu時間,但是每個程序每次獲得的是100ms。前文講過,程序分i\o消耗性和cpu消耗性,我們通常希望i\o消耗性程序的響應要快,排程頻率高,所以權重高。而對於cpu消耗型程序,我們希望排程頻率低,所以權重低。但是按照這樣分配,恰好相反,權重高的反而排程頻率低,響應慢。

2.是相對nice的問題,同樣假設nice=0分配的時間片為100ms,nice=1分配的時間片是95ms。這兩個優先順序之間時間片差距很小。而nice=18分配的時間片為10ms,nice=19分配的時間片為5ms,同樣只差了乙個優先順序,時間片分配卻差了兩倍。

3.要執行nice到時間片的對映,我們就需要乙個能分配的絕對時間片,比如前兩個問題中的5ms,並且這個時間片必須是核心可測量的。所以時間片一定必須是定時器節拍的整數倍,那麼我們的時間片分配就會隨著定時器節拍的變化而改變了。

4.如果我們給乙個要喚醒的程式提高優先順序,即使他的時間片已經耗盡,提高優先順序後,他又會被分配更多的時間片,他就可以更快的投入執行。雖然提高了響應效能,但是卻破壞了公平原則,會導致其他程序無法及時執行。

可見好處如此之多,那麼linux中的程序排程策略cfs就是基於時間比例才做到盡量公平的。cfs的基本設計理念就是:程序排程效果應如同系統具備一哥完美的多工處理器。

cfs中是在所有可執行程序總數基礎上計算出乙個程序可以執行多久,而不依靠nice值來計算時間片。cfs中nice值作為程序獲得程序執行時間比的權重:nice值越高獲得的使用比越低,nice值越低獲得的使用比越高。

那麼每個程序所獲得的cpu時間可以用:排程週期*程序權重/所有可執行程序權重和。所以這個排程週期越小,系統的響應越快,互動性越好,但是上下文切換會更頻繁,系統的總吞吐率會很低。比如排程週期是20ms,如果只有2個同優先順序程序,每個程序被搶占前都可以執行10ms。如果有10個程序,每個只能執行2ms。如果有20個,每個就僅僅能執行1ms了。

當任務數量無限多時,每個任務可以獲得的cpu時間會趨於0,這樣帶來的上下文切換消耗無法預估。所以cfs給每個程序提供了乙個獲得時間片的底線,成為最小粒度。預設是1ms。

cfs具體的實現有四個關鍵組成:時間記賬、程序選擇、睡眠和喚醒。

時間記賬:所有的排程器都必須對程序執行時間做記賬。例如我們分配給乙個程序時間片後,系統時鐘節拍發生時,時間片都會減少乙個節拍週期。當乙個程序的節拍週期減到0時,會被另乙個尚未到0的時間片的可執行程序搶占。

雖然cfs中沒有時間片了,但是也需要時間記賬,因為他要保證每個程序是在公平的時間範圍內執行。cfs中利用vruntime變數存放程序的虛擬執行時間,他表示了該程序執行了多長時間以及還應該執行多久,該時間是經過經過了所有可執行程序總數的標準化。它是以ns為單位,所以與定時器節拍不再相關。

程序選擇:cfs中就是選擇所有可執行程序中最小vruntime程序來執行。在cfs中所有可執行程序採用紅黑樹來儲存,每個節點的鍵值就是vruntime。紅黑樹最左葉子結點就是vruntime最小的程序,所以cfs只需要找到紅黑樹中最左葉子結點來執行就可以。

睡眠和喚醒:睡眠是程序處於不可執行狀態,核心操作是:程序把自己標記為睡眠,把程序從可執行紅黑樹移除,最後新增到等待佇列中,然後排程器選擇和執行其他程序。喚醒正好相反,就是把程序標記為可執行,從等待佇列刪除,新增到可執行紅黑樹中。

排程器何時執行是依靠核心中的need_resched標誌來實現的,系統會在系統調回返回使用者空間前、從終端或者異常處理返回使用者空間前都會判斷該標識狀態,如果設定了該標識,則會觸發一次排程策略。

設定該標識有三種方式:

1.時鐘中斷發現當前程序執行時間夠了。

2.喚醒某個程序時,發現喚醒程序vruntime比當前最執行程序vruntime小。

3.程序自己讓出cpu資源。

以上是基本理論概念,總結起來就是cfs採用了時間比例來分配cpu時間,利用vruntime和定時器節拍解耦,利用紅黑樹儲存可執行狀態程序,利用need_resched標識觸發排程器重新排程。

未完待續......

linux 程序排程1

程序分為實時程序和普通程序,分別對應實時排程策略和普通排程策略 在 task struct 中,有乙個成員變數,我們叫排程策略 unsigned int policy 它有以下幾個定義 define sched normal 0 define sched fifo 1 define sched rr...

《程序排程》1 排程原理與基礎概念

在正式介紹程序排程的細節前需要對一些概念作出介紹 程序排程的職責 負責決定在什麼時間,將那個程序投入使用,以及程序執行的時間。從而達到系統資源最大限度發揮,多程序併發執行的效果。1 就緒和執行狀態 task running 此時程式已經被掛入執行佇列,處於準備執行的狀態,一旦獲得處理器的使用許可權,...

程序排程演算法(程序排程策略)

程序排程演算法 排程演算法是指 根據系統的資源分配策略所規定的資源分配演算法。一 先來先服務和短作業 程序 優先排程演算法 1.先來先服務排程演算法。先來先服務 fcfs 排程演算法是一種最簡單的排程演算法,該演算法既可用於作業排程,也可用於程序排程。fcfs演算法比較有利於長作業 程序 而不利於短...