用top或者ps命令會輸出PRI/PR、NI、%ni/%nice這三種指標值,這些到底是什么東西?先給出大概的解釋如下:
PRI :進程優先權,代表這個進程可被執行的優先級,其值越小,優先級就越高,越早被執行;
NI :進程Nice值,代表這個進程的優先值;
%nice :改變過優先級的進程的占用CPU的百分比。
PRI是比較好理解的,即進程的優先級,或者通俗點說就是程序被CPU執行的先后順序,此值越小進程的優先級別越高。那NI呢?就是我們所要說的nice值了,其表示進程可被執行的優先級的修正數值。如前面所說,PRI值越小越快被執行,那么加入nice值后,將會使得PRI變為:PRI(new)=PRI(old)+nice。由此看出,PR是根據NICE排序的,規則是NICE越小PR越前(小,優先權更大),即其優先級會變高,則其越快被執行。如果NICE相同則進程uid是root的優先權更大。
在LINUX系統中,Nice值的范圍從-20到+19(不同系統的值范圍是不一樣的),正值表示低優先級,負值表示高優先級,值為零則表示不會調整該進程的優先級。具有最高優先級的程序,其nice值最低,所以在LINUX系統中,值-20使得一項任務變得非常重要;與之相反,如果任務的nice為+19,則表示它是一個高尚的、無私的任務,允許所有其他任務比自己享有寶貴的CPU時間的更大使用份額,這也就是nice的名稱的來意。
進程在創建時被賦予不同的優先級值,而如前面所說,nice的值是表示進程優先級值可被修正數據值,因此,每個進程都在其計划執行時被賦予一個nice值,這樣系統就可以根據系統的資源以及具體進程的各類資源消耗情況,主動干預進程的優先級值。在通常情況下,子進程會繼承父進程的nice值,比如在系統啟動的過程中,init進程會被賦予0,其他所有進程繼承了這個nice值(因為其他進程都是init的子進程)。
對nice值一個形象比喻,假設在一個CPU輪轉中,有2個runnable的進程A和B,如果他們的nice值都為0,假設內核會給他們每人分配1k個cpu時間片。但是假設進程A的為0,但是B的值為-10,那么此時CPU可能分別給A和B分配1k和1.5k的時間片。故可以形象的理解為,nice的值影響了內核分配給進程的cpu時間片的多少,時間片越多的進程,其優先級越高,其優先級值(PRI)越低。%nice,就是改變過優先級的進程的占用CPU的百分比,如上例中就是0.5k/2.5k=1/5=20%。
由此可見,進程nice值和進程優先級不是一個概念,但是進程nice值會影響到進程的優先級變化。
參考資料:
[1] http://blog.csdn.net/longdel/article/details/7317511