進程優先級和進程nice值(轉)

轉自:http://blog.csdn.net/phphot/archive/2009/04/28/4134609.aspx

首先,我想用一個簡單的命令來引起這個議題。 無論在linux或者unix系統中,用ps –l命令則會類似輸出以下幾個內容:

[root@dbbak root]# ps –l --- 這裏用的是linux測試
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 20538 20534 0 75 0 - 1063 wait4 pts/2 00:00:00 bash
4 R 0 20663 20538 0 75 0 - 828 - pts/2 00:00:00 ps
我們很容易注意到其中的幾個重要信息,有下:
UID : 代表執行者的身份
PID : 代表這個進程的代號
PPID :代表這個進程是由哪個進程發展衍生而來的,亦即父進程的代號
PRI :代表這個進程可被執行的優先級,其值越小越早被執行
NI :代表這個進程的nice值
這裏的前面的三個信息,我們都是比較好容易理解的,但是後面的兩個奇怪的信息,一個是PRI,一個是NI,這到底是什麼東西?相對而言,PRI也還是比較好理解的,即進程的優先級,或者通俗點說就是程序被CPU執行的先後順序,此值越小進程的優先級別越高。那NI呢?就是我們所要說的nice值了,其表示進程可被執行的優先級的修正數值。如前面所說,PRI值越小越快被執行,那麼加入nice值後,將會使得PRI變爲:PRI(new)=PRI(old)+nice。這樣,當nice值爲負值的時候,那麼該程序將會優先級值將變小,即其優先級會變高,則其越快被執行。

進程在創建時並不是平等的,他們被賦予不同的優先級值,例如有些對計算機本身的操作至關重要的程序必須比其他次要的程序具有更高的優先級(則其有更小的優先級值)。而如前面所說,nice的值是表示進程優先級值可被修正數據值,因此,每個進程都在其計劃執行時被賦予一個系統nice值,這樣系統就可以根據系統的資源以及具體進程的各類資源消耗情況,主動干預進程的優先級值。這個過程,用戶也可手工干預其中,但是要被賦予相應的權限。
在UNIX系統或者LINUX系統中,使用從-20到+19的一個可變數值來表示這個nice值(LINUX和AIX是這種情況,HP-UX系統的值範圍是從0到39),並且在通常情況下,子進程會繼承父進程的系統nice值。具有最高優先級的程序,其nice值最低,所以在UNIX和LINUX系統中,值-20使得一項任務變得非常重要(HP-UX爲0);與之相反,如果任務的 nice 爲+19(HP-UX爲39),則表示它是一個高尚的、無私的任務,允許所有其他任務比自己享有寶貴的 CPU 時間的更大使用份額,這也就是nice的名稱的意會來意。

在系統啓動的過程中,init進程會被賦予0(HP-UX系統值會被賦予20),其他所有進程繼承了這個nice值(因爲其他的進程都是init的子進程)。對於用戶,從他們開始登陸初始化進程,其餘在其底下衍生出來的子進程也會賦予該nice值。原始用戶,只能將其底下的執行進程的nice值變大(相對於其本身nice值而言)而不能變小;若想變小,得要有相應的權限,如root用戶可以設置變小,如下:

[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 ~]$ 
[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
對於後臺進程,其nice會在其被顯示賦予的值過後再加上4。如“nice 12 command &”命令執行時,則其會以nice=36值來運行程序(HP-UX系統)。這裏有個問題,即如果用戶設置的nice值超過了nice的邊界值(LINUX和AIX爲-20到19,HP-UX爲0到39)會怎樣,則系統就取nice的邊界值作爲進程的nice值。

與進程的nice相關的命令有2個,分別是nice和renice。
nice命令就是設置一個要執行command進程的nice值,其命令格式是 nice –n adjustment command command_option,這裏就設置要執行的command的nice,如果這裏不指定adjustment,則默認爲10。
renice命令就是設置一個已經在運行的進程的nice值,如假設一運行進程本來nice值爲0,renice爲3後,則這個運行進程的nice值就爲3了。renice的執行必須要有相應的權限方可執行。它可以根據用戶、進程ID、進程組來設置進程的nice值。

對nice值一個形象比喻,假設在一個CPU輪轉中,有2個runnable的進程A和B,如果他們的nice值都爲0(如果是HP-UX則爲20),加上內核會給他們每人分配1k個cpu時間片。但是假設進程A的爲0,但是B的值爲-10,那麼此時CPU則會可能分別給A和B分配1k和1.5k的時間片。故可以形象的理解爲,nice的值影響了內核分配給進程的cpu時間片的多少,時間片越多的進程,其優先級越高,其優先級值越低。

從使用top、ps等命令看到的nice值,就是進程所擁有的nice值,使用iostat等看到的%nice,就是用戶進程空間中改變過優先級的進程的佔用CPU的百分比,如上例中就說0.5k/2.5k=1/5=20%。

到目前爲止,更需要強調一點的是,進程的nice值不是進程的優先級,他們不是一個概念,但是進程nice值會影響到進程的優先級變化。

--EOF--

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章