為什么要有進程優(yōu)先級抡句?
- 這似乎不用過多的解釋探膊,畢竟自從多任務(wù)操作系統(tǒng)誕生以來,進程執(zhí)行占用cpu的能力就是一個必須要可以人為控制的事情玉转。因為有的進程相對重要突想,而有的進程則沒那么重要殴蹄。
- 進程優(yōu)先級起作用的方式從發(fā)明以來基本沒有什么變化究抓,無論是只有一個cpu的時代,還是多核cpu時代袭灯,都是通過控制進程占用cpu時間的長短來實現(xiàn)的刺下。
就是說在同一個調(diào)度周期中,優(yōu)先級高的進程占用的時間長些稽荧,而優(yōu)先級低的進程占用的短些荒椭。
NI和PR
-
請大家真的不要混淆了系統(tǒng)中的這兩個概念:nice(NI)和priority(PR)铜秆,他們有著千絲萬縷的關(guān)系,但對于當前的Linux系統(tǒng)來說,它們并不是同一個概念裕循。
我們看這個命令:
- 大家是否真的明白其中PRI列和NI列的具體含義有什么區(qū)別?
同樣的璃岳,如果是top命令:
- 大家是否搞清楚了這其中PR值和NI值的差別涡尘?如果沒有,那么我們可以首先搞清楚什么是nice值歼争。
什么是NICE值拜马?
NICE值應(yīng)該是熟悉Linux/UNIX的人很了解的概念了,它是反應(yīng)一個進程“優(yōu)先級”狀態(tài)的值沐绒,其取值范圍是-20至19俩莽,一共40個級別。
這個值越小乔遮,表示進程”優(yōu)先級”越高扮超,而值越大“優(yōu)先級”越低。
例如,我們可以通過NICE命令來對一個將要執(zhí)行的bash命令進行NICE值設(shè)置出刷,方法是:
[root@zorrozou-pc0 zorro]# nice -n 10 bash
- 這樣我就又打開了一個bash蝉衣,并且其nice值設(shè)置為10,而默認情況下巷蚪,進程的優(yōu)先級應(yīng)該是從父進程繼承來的病毡,這個值一般是0。
我們可以通過nice命令直接查看到當前shell的nice值:
[root@zorrozou-pc0 zorro]# nice10
對比一下正常情況:
[root@zorrozou-pc0 zorro]# exit
退出當前nice值為10的bash屁柏,打開一個正常的bash啦膜,我們查看下其 Nice值:
[root@zorrozou-pc0 zorro]# bash[root@zorrozou-pc0 zorro]# nice0
- 另外,使用renice命令可以對一個正在運行的進程進行nice值的調(diào)整淌喻,我們也可以使用比如top僧家、ps等命令查看進程的nice值,具體方法我就不多說了裸删,大家可以參閱相關(guān)man page八拱。
- 需要大家注意的是,我在這里都在使用nice值這一稱謂涯塔,而非優(yōu)先級(priority)這個說法肌稻。nice值雖然不是priority,但是它確實可以影響進程的優(yōu)先級匕荸。
- 在英語中爹谭,如果我們形容一個人nice,那一般說明這個人的人緣比較好榛搔。什么樣的人人緣好诺凡?往往是謙讓、有禮貌的人践惑。
- 比如腹泌,你跟一個nice的人一起去吃午飯,點了兩個一樣的飯尔觉,先上了一份后凉袱,nice的那位一般都會說:“你先吃你先吃!”穷娱,這就是人緣好绑蔫,這人nice!但是如果另一份上的很晚泵额,那么這位nice的人就要餓著了配深。
這說明什么? - 越nice的人搶占資源的能力就越差嫁盲,而越不nice的人搶占能力就越強篓叶。這就是nice值大小的含義烈掠,nice值越低,說明進程越不nice缸托,搶占cpu的能力就越強左敌,優(yōu)先級就越高(作者這個解釋太形象了,小編忍不住要手動點贊@洹=孟蕖)。
在原來使用O1調(diào)度的Linux上佩抹,我們還會把nice值叫做靜態(tài)優(yōu)先級叼风,這也基本符合nice值的特點,就是當nice值設(shè)定好了之后棍苹,除非我們用renice去改它无宿,否則它是不變的。
而priority的值在之前內(nèi)核的O1調(diào)度器上表現(xiàn)是會變化的枢里,所以也叫做動態(tài)優(yōu)先級孽鸡。
什么是優(yōu)先級和實時進程? - 我們再來看看什么是priority值栏豺,就是ps命令中看到的PRI值或者top命令中看到的PR值彬碱。本文為了區(qū)分這些概念,以后:
- 統(tǒng)一用nice值表示NI值冰悠,或者叫做靜態(tài)優(yōu)先級堡妒,也就是用nice和renice命令來調(diào)整的優(yōu)先級;
- 而實用priority值表示PRI和PR值溉卓,或者叫動態(tài)優(yōu)先級。我們也統(tǒng)一將“優(yōu)先級”這個詞的概念規(guī)定為表示priority值的意思搬泥。
在內(nèi)核中桑寨,進程優(yōu)先級的取值范圍是通過一個宏定義的,這個宏的名稱是MAX_PRIO忿檩,它的值為140尉尾。
而這個值又是由另外兩個值相加組成的,一個是代表nice值取值范圍的NICE_WIDTH宏燥透,另一個是代表實時進程(realtime)優(yōu)先級范圍的MAX_RT_PRIO宏沙咏。
說白了就是,Linux實際上實現(xiàn)了140個優(yōu)先級范圍班套,取值范圍是從0-139肢藐,這個值越小,優(yōu)先級越高吱韭。nice值的-20到19吆豹,映射到實際的優(yōu)先級范圍是100-139。
新產(chǎn)生進程的默認優(yōu)先級被定義為:
#define DEFAULT_PRIO (MAX_RT_PRIO + NICE_WIDTH / 2)
實際上對應(yīng)的就是nice值的0。
正常情況下痘煤,任何一個進程的優(yōu)先級都是這個值凑阶,即使我們通過nice和renice命令調(diào)整了進程的優(yōu)先級,它的取值范圍也不會超出100-139的范圍衷快,除非這個進程是一個實時進程宙橱,那么它的優(yōu)先級取值才會變成0-99這個范圍中的一個。
-
更多資料原文
-
結(jié)合內(nèi)核態(tài)和用戶態(tài)有更深的體會和收獲