Linux內核學習-進程調度

1、調度策略和算法

進程調度策略:決定以怎樣的方式選擇一個新進程運行的這組規則。

其基本要求是高效、公平。常用的進程調度策略如下:

、優先級高優先調度策略將處理器分配給就緒進程隊列中優先級最高的進程。各進程的優先級通常由進程調度程序根據進程的實際情況動態計算出來


優先級靜態策略是在進程創建初期根據進程類型(是系統還是用戶進程、前臺還是後臺進程)、要求的資源量(處理器佔用時間、內存量等)以及運行時間等確定其級別,一旦確定後在整個進程運行期間不再調整。優先級靜態策略易於實現但不盡合理,因爲可能會造成低優先級的進程等待時間過長。


動態優先級策略是在進程運行過程中不斷隨進程狀態的變化調整其優先級。該算法要求在每個進程的控制塊中,動態記錄該進程使用和放棄處理器的時間,以便在調度時根據處理器使用時間長短確定其優先級

比如,某進程等待使用處理器時間較長,可適當調高其優先級,反之,則降低其優先級。這種策略可以獲得較好的調度效果,但實現較複雜。

、時間片輪轉調度策略:系統將處理器分配給就緒隊列中位於隊首的進程,並規定其執行的一段時間(稱爲時間片)。當該進程用完時間片後,進程調度程序將其送至就緒隊列的隊尾,並把處理器分配給就緒隊列中的下一個位於隊首的進程,再執行同樣大小的時間片依次輪轉,使就緒隊列中的所有進程都可以輪流獲得一個時間片的處理器執行時間。這種策略又稱爲先來先服務策略,較爲公平。

、多重循環輪轉調度策略預設若干個循環輪轉時間片長短不同的就緒隊列。進程從阻塞狀態進入就緒狀態時,首先進入時間片最短的隊列,獲得處理器並運行完短時間片後,再排入下一個較長時間片的隊列,以此類推,雖然進程開始時的時間片很短,但下一次輪到後時間會增加若干倍,因此,進入的就緒隊列時間片越來越長。這樣有利於執行時間較短的進程以較短的時間片完成進程處理,而需時較長的進程可獲較長的時間片,以免頻繁中斷進程影響處理器效率。

2 調度算法

Linux進程:

調度算法根據是普通進程還是實時進程有很大的區別

2.1 普通進度的調度

1、調度程序使用靜態優先級(決定了進程的基本時間片)來估價這個進程與其他普通進程之間調度的程度。(普通進程的靜態優先級100【最高優先級】到139【最低優先級】)

--靜態優先級越高(其值越小),基本時間片就越長;與優先級低的進程相比,通常優先級較高的進程獲得更長的CPU時間片

2、動態優先級是調用程序在選擇新進程來運行的時候使用的數。(普通進程除了靜態優先級還有動態優先級)

bonus是範圍從0~10的值,值小於5表示降低動態優先級以示懲罰,值大於5表示增加動態優先級以示獎賞。bonus與進程的平均睡眠時間(進程在睡眠狀態所消耗的平均納秒數)有關。

平均睡覺時間越大bonus越大。

3、即使具有較高靜態優先級的普通進程獲得了較大的CPU時間片,也不應該使靜態優先級較低的進程無法運行。避免進程飢餓,當一個進程用完它的時間片時,它應該被還沒有用完時間片的低優先級進程取代

爲了實現這種機制,調度程序維持兩個不相交的可運行進程的集合。

活動進程:這些進程還沒有用完它們的時間片,因此運行它們運行。

過期進程:這些可運行進程已經用完了它們的時間片,並因此被禁止運行,直到所有活動進程都過期。

2.2 實時進程調度

1、實時進程都與一個實時優先級相關,實時優先級範圍1(最高優先級)~99(最低優先級);調度程序總是讓優先級高的程序運行。實時進程運行過程中,禁止低優先級進程的執行。

2、如果幾個可運行的實時進程具有相同的最高優先級,那邊調度程序選擇第一個出現在與本地CPU的運行隊列相應鏈表中的進程

3、實時進程只有在下面情況才會被另外一個進程取代

   (1)進程被另外一個具有更高實時優先級的實時進程搶佔;

   (2)進程執行了阻塞操作並進入睡眠;

   (3)進程停止或被殺死;

  (4)進程通過調用系統調用sched_yield()自願放棄CPU;

   (5)進程是基於時間片輪轉的實時進程(SCHED_RR),而且用完了它的時間片;

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章