用top或者ps命令會輸出PRI/PR、NI、%ni/%nice這三種指標值,這些究竟是什麼東西?先給出大概的解釋以下:oracle
PRI :進程優先權,表明這個進程可被執行的優先級,其值越小,優先級就越高,越早被執行ui
NI :進程Nice值,表明這個進程的優先值spa
%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%。it
因而可知,進程nice值和進程優先級不是一個概念,可是進程nice值會影響到進程的優先級變化。io
進程的nice值是能夠被修改的,修改命令分別是nice和renice。import
一、nice命令就是設置一個要執行command進程的nice值,其命令格式是 nice –n adjustment command command_option,若是這裏不指定adjustment,則默認爲10。
二、renice命令就是設置一個已經在運行的進程的nice值,假設一運行進程原本nice值爲0,renice爲3後,則這個運行進程的nice值就爲3了。
說明:若是用戶設置的nice值超過了nice的邊界值(LINUX爲-20到+19),系統就取nice的邊界值做爲進程的nice值。
舉例以下:
對非root用戶,只能將其底下的進程的nice值變大而不能變小。若想變小,得要有相應的權限。
[oracle@perf_dbc ~]$ nice
0
[oracle@perf_dbc ~]$ nice -n 3 ls
agent bin important_bak logs statistics_import.log TMP_FORUM_STATS.dmp TMP_TAOBAO_STATS.dmp TMP_TBCAT_STATS.dmp top.dmp worksh
[oracle@perf_dbc ~]$ nice -n -3 ls
nice: cannot set priority: Permission denied
對root用戶,能夠給其子進程賦予更小的nice值。
[root@dbbak root]# nice
0
[root@dbbak root]# nice -n -3 ls
192.168.205.191.txt anaconda-ks.cfg clariion.log Desktop disk1 emc.sh File_sort install.log install.log.syslog log OPS rhel_os_soft root_link_name
一樣,renice的執行也必需要有相應的權限方可執行。