天天看點

程序排程的目标,nice值,靜态優先級,動态優先級,實時優先級,時間片 .

本系列文章由張同浩編寫,轉載請注明出處:http://blog.csdn.net/muge0913/article/details/7562133

郵箱:[email protected]

程序排程的目标:

1、高效性:高效意味着在相同的時間下要完成更多的任務。排程程式會被頻繁的執行,是以排程程式要盡可能的高效。

2、加強互動性能(interactivity):在系統相當的負載下,也要保證系統的響應時間。

3、保證公平和避免饑渴。

4、SMP排程:排程程式必須支援多處理系統。系統必須追蹤哪些程序在哪個cpu上運作。確定在同一時間中,一個程序不能再多于1個的cpu上運作。

5、軟實時排程(soft real-timescheduling):系統必須有效的調用實時程序。

linusTorvalds 在CFS融入2.6.23時說:“我認為任何時候排程器都不是完美的 ,正确的并不是非此即彼,選擇是一種平衡。在我更換排程器之前我100%确定未來我還會更換它。排程器沒有想象的那麼重要,它隻是核心的一部分。”

程序的nice值:

nice值是每個程序的一個屬性。它不是程序的優先級,而是一個能影響優先級的數字。

程式排程的目标,nice值,靜态優先級,動态優先級,實時優先級,時間片 .

NI列顯示的每個程序的nice值,PRI是程序的優先級。

nice是-20~~19之間的整數,預設取中間值0。

目前的核心不再存儲nice值。取而代之的是static_prio(靜态優先級)。nice值使用者可見,靜态優先級則隐藏在核心中,nice值和靜态優先級可通過一定的關系程序轉換。是以說nice值隻是影響了靜态優先級。而對于普通程序來說,動态優先級是基于靜态優先級算出來的。

優先級:

普通程序有:靜态優先級和動态優先級。而實時程序又增加了實時優先級。

注:程序的優先級隻是一個整數,它是排程程式選擇程序運作的基礎。

1、靜态優先級:static priority:之是以稱為靜态優先級是因為它不會随着時間而改變,核心不會修改它,隻能通過系統調用nice去修改。靜态優先級用程序描述符中的static_prio表示。它與nice的關系如圖:

程式排程的目标,nice值,靜态優先級,動态優先級,實時優先級,時間片 .

nice與 static_prio 之間的關系如下:

[cpp] view plain copy print ?

  1. static_prio= MAX_RT_PRIO + nice + 20  

static_prio= MAX_RT_PRIO + nice + 20

MAX_RT_PRIO值為100

核心定義了兩個宏用來完成這一轉換:PRIO_TO_NICE()、NICE_TO_PRIO()。

在kernel/sched.c中:

[cpp] view plain copy print ?

  1. #defineNICE_TO_PRIO(nice)  (MAX_RT_PRIO + (nice)+ 20)   
  2. #definePRIO_TO_NICE(prio)  ((prio) - MAX_RT_PRIO- 20)  

/*

* 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。

[cpp] view plain copy print ?

  1. prio=MAX_RT_PRIO-1 – rt_priority  

prio=MAX_RT_PRIO-1 – rt_priority

時間片:

在完全公平排程器CFS融入核心之前,時間片是各種排程器的一個重要的概念。它指定了程序在被搶占之前所能運作的時間。調用器的一個重要目标便是有效的配置設定時間片,以便提供良好的使用者體驗。時間片分的過長會導緻互動式程序響應不佳。時間片分的過長會導緻程序切換帶來的消耗。為了解決這個沖突核心采用了:

1、提高互動程序的優先級,同時配置設定預設的時間片

2、不需要程序一次性用完時間片,可多次使用。

高的優先級可保證互動程序的頻繁調用,長的時間片可保證它們可長時間處于可執行狀态