宋寶華: 關於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 |
0 |
rt |
NICE 5 |
25 |
|
NICE -5 |
15 |
由此發現,在top裡面,RT策略的PR都顯示為負數;最高優先順序的RT,顯示為rt。top命令裡面也是,數字越小,優先順序越高。
(打賞的童鞋請在打賞的時候留言讓在下知道是誰並感恩)
查看"Linux閱碼場"精華技術文章請移步:
Linux閱碼場原創精華文章匯總
掃描二維碼關注
"Linux閱碼場"
推薦閱讀: