歡迎光臨
每天分享高質量文章

宋寶華: 關於Linux行程優先級數字混亂的徹底澄清

有點暈

Linux行程的調度優先級數字會在好幾個地方出現:內核,用戶,top命令。他們各自都有自己的表示法。
我們用一個實際的例子來說明,下麵在Linux寫一個最簡單的程式:

編譯它運行,把調度策略設置為SCHED_FIFO,優先級設置為50
$ sudo chrt -f 50 ./a.out
這個時候我們在top命令裡面觀察a.out:

我們看到a.out的PR(優先級是)-51,CPU利用率100%。

但是從內核的視角上面來看,又會用99減去用戶在chrt裡面設置的優先級:


上面的MAX_RT_PRIO的值為:

所以上述行程的優先級,在三個不同視角的值分別為:

用戶

內核

Top

50

49

-51

咋回事

Linux的RT調度策略和普通行程在調度演算法上面有差異,RT的SCHED_FIFO和SCHED_RR採用的是一個bitmap:

每次從第0bit開始往後面搜索第一個有行程ready的bit,然後調度這個優先級上面的行程執行,所以在內核裡面,prio數值越小,優先級越高

但是從用戶態的API裡面,則是數值越大,優先級越高。下麵的代碼,一個執行緒通過呼叫API把自己設置為SCHED_FIFO,優先級50

這個上面的50,對應內核的49。
如果我們把優先級設置為51:

這個51,對應內核bitmap上面的48。
所以,你會發現,從用戶的視角來看,數值變大,優先級變高。
上面這2個視角,都不是top命令的視角。對於RT的行程而言,TOP的視角裡面的
PR= -1 -用戶視角
譬如,下麵用戶視角的88

$ sudo chrt -f 88 ./a.out

對應內核視角的11,對應top視角的-89

這實在讓人有一點暈!!

這裡還有一個特例,就是用戶視角的99(內核bitmap視角的0),顯示為top命令的RT:

這說明一點,只有最高優先級的RT行程,才在top裡面顯示為rt。

普通的呢?

普通的講nice的人相對來說比較簡單,我們更關註它的nice值,-20~19之間,nice越低,優先級越高,權重越大,在CFS的紅黑樹左邊的機會大。

你發現.nice為5的行程,在top命令顯示PR是25。
下麵我們看nice是-5的:

它顯示的是PR=15。
由此大家可以發現規律,對於普通的採用CFS策略的NORMAL行程,top裡面的
PR=20+NICE

在一起

總結一下,4個例子

用戶

內核

Top

RT 50

49 (99-50)

-51 (-1-50)

RT 99

rt

NICE 5

25

NICE -5

15

由此發現,在top裡面,RT策略的PR都顯示為負數;最高優先級的RT,顯示為rt。top命令裡面也是,數字越小,優先級越高。

赞(0)

分享創造快樂