為什么要有進程優(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)來說,它們并不是同一個概念。
我們看這個命令:

Paste_Image.png
- 大家是否真的明白其中PRI列和NI列的具體含義有什么區(qū)別?
同樣的,如果是top命令:

Paste_Image.png
- 大家是否搞清楚了這其中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)有更深的體會和收獲