進程調度的目標,nice值,靜態優先級,動態優先級,實時優先級,時間片
進程調度的目標:
1、高效性:高效意味著在相同的時間下要完成更多的任務。調度程序會被頻繁的執行,所以調度程序要盡可能的高效。
2、加強交互性能(interactivity):在系統相當的負載下,也要保證系統的響應時間。
3、保證公平和避免饑渴。
4、SMP調度:調度程序必須支持多處理系統。系統必須追蹤哪些進程在哪個cpu上運行。確保在同一時間中,一個進程不能再多於1個的cpu上運行。
5、軟實時調度(soft real-timescheduling):系統必須有效的調用實時進程。
linusTorvalds 在CFS融入2.6.23時說:“我認為任何時候調度器都不是完美的 ,正確的並不是非此即彼,選擇是一種平衡。在我更換調度器之前我100%確定未來我還會更換它。調度器沒有想象的那麼重要,它只是內核的一部分。”
進程的nice值:
nice值是每個進程的一個屬性。它不是進程的優先級,而是一個能影響優先級的數字。
NI列顯示的每個進程的nice值,PRI是進程的優先級。
nice是-20~~19之間的整數,默認取中間值0。
目前的內核不再存儲nice值。取而代之的是static_prio(靜態優先級)。nice值用戶可見,靜態優先級則隱藏在內核中,nice值和靜態優先級可通過一定的關系進程轉換。所以說nice值只是影響了靜態優先級。而對於普通進程來說,動態優先級是基於靜態優先級算出來的。
優先級:
普通進程有:靜態優先級和動態優先級。而實時進程又增加了實時優先級。
注:進程的優先級只是一個整數,它是調度程序選擇進程運行的基礎。
1、靜態優先級:static priority:之所以稱為靜態優先級是因為它不會隨著時間而改變,內核不會修改它,只能通過系統調用nice去修改。靜態優先級用進程描述符中的static_prio表示。它與nice的關系如圖:
查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/
nice與 static_prio 之間的關系如下:
static_prio= MAX_RT_PRIO + nice + 20
MAX_RT_PRIO值為100
內核定義了兩個宏用來完成這一轉換:PRIO_TO_NICE()、NICE_TO_PRIO()。
在kernel/sched.c中:
/* * Convert user-nice values [ -20 ... 0 ... 19] * to static priority [ MAX_RT_PRIO..MAX_PRIO-1], * and back. */ #defineNICE_TO_PRIO(nice) (MAX_RT_PRIO + (nice)+ 20) #definePRIO_TO_NICE(prio) ((prio) - MAX_RT_PRIO- 20)
2、動態優先級:調度程序通過增加或減少進程靜態優先級的值來獎勵IO小號型進程或懲罰cpu消耗型進程。調整後的優先級稱為動態優先級。在進程描述符中用prio表示,通常所說的優先級指的是動態優先級。在 0~MAX_PRIO-1 之間取值(MAX_PRIO 定義為 140),其中 0~MAX_RT_PRIO-1 (MAX_RT_PRIO 定義為100)屬於實時進程范圍,MAX_RT_PRIO~MX_PRIO-1屬於非實時進程。數值越大,表示進程優先級越小。
普通進程的優先級通過一個關於靜態優先級和進程交互性函數關系計算得到。隨實際任務的實際運行情況得到。實時優先級和它的實時優先級成線性,不隨進程的運行而改變。
3、實時優先級:
實時優先級只對實時進程有意義。在進程描述符rt_priority中。取值0~MAX_RT_PRIO-1。
prio=MAX_RT_PRIO-1 – rt_priority
時間片:
在完全公平調度器CFS融入內核之前,時間片是各種調度器的一個重要的概念。它指定了進程在被搶占之前所能運行的時間。調用器的一個重要目標便是有效的分配時間片,以便提供良好的用戶體驗。時間片分的過長會導致交互式進程響應不佳。時間片分的過長會導致進程切換帶來的消耗。為了解決這個矛盾內核采用了:
1、提高交互進程的優先級,同時分配默認的時間片
2、不需要進程一次性用完時間片,可多次使用。
高的優先級可保證交互進程的頻繁調用,長的時間片可保證它們可長時間處於可執行狀態
出處:http://blog.csdn.net/muge0913/article/details/7562133