[勝通]程式優先順序和程式nice值?
首先,我想用一個簡單的命令來引起這個議題。 無論在linux或者unix系統中,用ps –l命令則會類似輸出以下幾個內容:
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使用者可以設定變小,如下:
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值,如下:
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值會影響到程式的優先順序變化。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1384/viewspace-611326/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux基礎命令---升值程式優先順序niceLinux
- Linux基礎命令---設定程式優先順序niceLinux
- C語言nice()函式:改變程式優先順序C語言函式
- Linux基礎命令—修改程式優先順序reniceLinux
- Linux基礎命令---修改程式優先順序reniceLinux
- Android程式優先順序Android
- win10怎麼設定優先順序 win10如何設定程式程式優先順序Win10
- 程式初始(二)——程式優先順序,環境變數變數
- CSS優先順序CSS
- html優先順序和層疊性HTML
- 中斷優先順序
- win10如何設定優先程式_win10怎麼設定程式優先順序Win10
- python運算子及優先順序順序Python
- HttpClient和HttpGet 引數的優先順序HTTPclient
- gc current block busy和LMS優先順序GCBloC
- SQL 優先順序join>whereSQL
- java運算子優先順序Java
- nginx快取優先順序Nginx快取
- php運算子優先順序PHP
- css優先順序彙總CSS
- linux中設定程式排程的優先順序別Linux
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- toString()和valueOf()函式呼叫和優先順序函式
- java字串連線和運算子優先順序Java字串
- java setPriority()設定優先順序Java
- [譯]HTTP/2的優先順序HTTP
- 封裝優先順序佇列封裝佇列
- Yarn任務優先順序配置Yarn
- gitignore優先順序小結Git
- css 選擇器優先順序CSS
- CSS的處理優先順序CSS
- java執行緒優先順序Java執行緒
- 資料型別優先順序資料型別
- 深入理解css優先順序CSS
- NLS引數優先順序解析
- 華為路由協議優先順序路由協議
- C++運算子優先順序C++
- 程式設計答疑:記不住運算子優先順序怎麼辦?程式設計