Linux進(jìn)程的調(diào)度優(yōu)先級(jí)數(shù)字會(huì)在好幾個(gè)地方出現(xiàn):內(nèi)核,用戶(hù),top命令。他們各自都有自己的表示法。我們用一個(gè)實(shí)際的例子來(lái)說(shuō)明,下面在Linux寫(xiě)一個(gè)最簡(jiǎn)單的程序:
編譯它運(yùn)行,把調(diào)度策略設(shè)置為SCHED_FIFO,優(yōu)先級(jí)設(shè)置為50:$ sudo chrt -f50./a.out這個(gè)時(shí)候我們?cè)趖op命令里面觀(guān)察a.out:
我們看到a.out的PR(優(yōu)先級(jí)是)-51,CPU利用率100%。但是從內(nèi)核的視角上面來(lái)看,又會(huì)用99減去用戶(hù)在chrt里面設(shè)置的優(yōu)先級(jí):
上面的MAX_RT_PRIO的值為:
所以上述進(jìn)程的優(yōu)先級(jí),在三個(gè)不同視角的值分別為:
| 用戶(hù) | 內(nèi)核 | Top |
| 50 | 49 | -51 |
咋回事
Linux的RT調(diào)度策略和普通進(jìn)程在調(diào)度算法上面有差異,RT的SCHED_FIFO和SCHED_RR采用的是一個(gè)bitmap:
每次從第0bit開(kāi)始往后面搜索第一個(gè)有進(jìn)程ready的bit,然后調(diào)度這個(gè)優(yōu)先級(jí)上面的進(jìn)程執(zhí)行,所以在內(nèi)核里面,prio數(shù)值越小,優(yōu)先級(jí)越高。但是從用戶(hù)態(tài)的API里面,則是數(shù)值越大,優(yōu)先級(jí)越高。下面的代碼,一個(gè)線(xiàn)程通過(guò)調(diào)用API把自己設(shè)置為SCHED_FIFO,優(yōu)先級(jí)50
這個(gè)上面的50,對(duì)應(yīng)內(nèi)核的49。如果我們把優(yōu)先級(jí)設(shè)置為51:
這個(gè)51,對(duì)應(yīng)內(nèi)核bitmap上面的48。所以,你會(huì)發(fā)現(xiàn),從用戶(hù)的視角來(lái)看,數(shù)值變大,優(yōu)先級(jí)變高。上面這2個(gè)視角,都不是top命令的視角。對(duì)于RT的進(jìn)程而言,TOP的視角里面的PR= -1 -用戶(hù)視角譬如,下面用戶(hù)視角的88,
$ sudo chrt -f 88 ./a.out
對(duì)應(yīng)內(nèi)核視角的11,對(duì)應(yīng)top視角的-89:
這實(shí)在讓人有一點(diǎn)暈!!這里還有一個(gè)特例,就是用戶(hù)視角的99(內(nèi)核bitmap視角的0),顯示為top命令的RT:
這說(shuō)明一點(diǎn),只有最高優(yōu)先級(jí)的RT進(jìn)程,才在top里面顯示為rt。
普通的呢?
普通的講nice的人相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,我們更關(guān)注它的nice值,-20~19之間,nice越低,優(yōu)先級(jí)越高,權(quán)重越大,在CFS的紅黑樹(shù)左邊的機(jī)會(huì)大。
你發(fā)現(xiàn).nice為5的進(jìn)程,在top命令顯示PR是25。下面我們看nice是-5的:
它顯示的是PR=15。由此大家可以發(fā)現(xiàn)規(guī)律,對(duì)于普通的采用CFS策略的NORMAL進(jìn)程,top里面的PR=20+NICE
在一起
總結(jié)一下,4個(gè)例子
| 用戶(hù) | 內(nèi)核 | Top |
| RT 50 | 49 (99-50) | -51 (-1-50) |
| RT 99 | 0 | rt |
| NICE 5 | 25 | |
| NICE -5 | 15 |
由此發(fā)現(xiàn),在top里面,RT策略的PR都顯示為負(fù)數(shù);最高優(yōu)先級(jí)的RT,顯示為rt。top命令里面也是,數(shù)字越小,優(yōu)先級(jí)越高。
-
內(nèi)核
+關(guān)注
關(guān)注
4文章
1474瀏覽量
43087 -
Linux
+關(guān)注
關(guān)注
88文章
11806瀏覽量
219486 -
編譯
+關(guān)注
關(guān)注
0文章
696瀏覽量
35265
原文標(biāo)題:宋寶華: 關(guān)于Linux進(jìn)程優(yōu)先級(jí)數(shù)字混亂的徹底澄清
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
嵌入式技術(shù)中如何定義進(jìn)程優(yōu)先級(jí)
基于優(yōu)先級(jí)搶占系統(tǒng)的QNX調(diào)度算法
Linux進(jìn)程優(yōu)先級(jí)和環(huán)境變量詳解
Linux內(nèi)核進(jìn)程管理與調(diào)度:策略?xún)?yōu)化與實(shí)踐分析
深入Linux內(nèi)核:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)
干貨分享:基于嵌入式Linux中進(jìn)程調(diào)度實(shí)現(xiàn)方法
鴻蒙內(nèi)核源碼分析(調(diào)度隊(duì)列篇):進(jìn)程和Task的就緒隊(duì)列對(duì)調(diào)度的作用
Linux 2.6進(jìn)程調(diào)度
嵌入式系統(tǒng)優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題的分析
Linux進(jìn)程調(diào)度的原理解析
Linux 進(jìn)程調(diào)度淺析
嵌入式Linux實(shí)時(shí)進(jìn)程調(diào)度算法改進(jìn)
linux進(jìn)程調(diào)度淺析
鴻蒙內(nèi)核源碼:32級(jí)優(yōu)先級(jí)的進(jìn)程和線(xiàn)程調(diào)度
uC/OS-II學(xué)習(xí)筆記——優(yōu)先級(jí)反轉(zhuǎn)與優(yōu)先級(jí)繼承機(jī)制
如何解決Linux進(jìn)程調(diào)度優(yōu)先級(jí)數(shù)字混亂的問(wèn)題?詳細(xì)實(shí)例分析
評(píng)論