farmer-logo.gif (14959 bytes) cshell-logo.gif (19625 bytes)
ch-3.gif (10141 bytes)
main-b.gif (271 bytes)
 

 

3-8-8 nice [ +n | -n ] 指令

UNIX 作業系統是一個多人多工的分時(time-sharing)作業系統。所有人的所執行的所有程式均可在系統中同時運作。每一個執行的程式對系統而言都會給於相對映到處理程序(process)。系統以程序定序(process scheduling)的管理方式來安排這些程序,讓它們依序、循環地進到核心程式中執行。這其中的程序運作實際上是非常複雜的,但我們只需要注意到一個觀念,就是程序定序中有設定優先權的處理方式。而內建指令 nice 的作用便是能讓使用者透過它,去調變程序優先權(process priority)中關於計算處理的一項參數。借以控制該程序在同一時間內所能享用的CPU資源的多寡。 nice 內建指令用數字“-20”到“+19”來代表程序優先權的高低。數字“-20”優先權最高,而數字“+19”優先權則是最低。一般使用者所能調變的範圍是“0”到“+19”,固定的設定值是“0”,也就是一般使用者所能得到的最高程序優先權。而 super-user 所能調變就比一般的使用者為大,範圍是“-20”到“+19”(這便是我們稱他為 super-user 的原因之一)。

當我們使用指令 ps -l 來顯示系統的處理程序時, NI 欄為所代表的數字就是程序優先權的數值。我們先來看一般指令的程序優先權情況,如下:

3 % ps -l
F UID PID PPID CP PRI NI SZ RSS WCHAN STAT TT TIME COMMAND
20488201 101 3398 3397 0 15 0 56 376 kernelma S p0 0:00 -csh (csh)
20000001 101 3402 3398 9 27 0 216 456 R p0 0:00 ps -l

我們可清楚地看觀察到 NI 欄的數字均為“0”。現在讓我們降低程序優先權來執行指令 ps -l 看看結果:

5 % nice +10 ps -l
F UID PID PPID CP PRI NI SZ RSS WCHAN STAT TT TIME COMMAND
20488201 101 3398 3397 1 15 0 56 216 kernelma S p0 0:00 -csh (csh)
20000001 101 3412 3398 18 49 10 216 452 R N p0 0:00 ps -l

看 NI 欄的程序優先權為“10”,正如我們所下的指令效果。

能妥善地運用調整指令的程序優先權,將有助於提昇系統的使用效率。這點在一個忙的不得了的機器上,善用指令 nice 整體的工作效率將會有所改善。譬如你 Open Windows 的環境下,一面在執行比較高優先的工作的同時,一面在操作一般的系統指令,如果你能適當地將次要的系統指令操作降低程序優先權,就會縮短高優先的工作時間。比較方便的做法是以 nice 指令來執行一個較低優先的 subshell 或者是開一個較低優先 xterm,則你在這個 subshell 或 xterm 之下所操作的任何指令,都會得到較低優先的程序處理權。

C shell的內建指令 nice 固定的程序優先權數值為“4”。如下所示:

7 % nice ps -l
F UID PID PPID CP PRI NI SZ RSS WCHAN STAT TT TIME COMMAND
20488201 101 3609 3608 0 15 0 56 228 kernelma S p2 0:00 -csh (csh)
20000001 101 3619 3609 19 37 4 216 452 R N p2 0:00 ps -l

當你運用 nice 指令時請注意一點,在 nice 指令不接受別名所設定的“指令”,也就是說要用 nice 來下指令時,別名的功能將失去它的效用。請小心使用之。另外與 nice 指令相關的是 renice 指令。 nice 指令是要在下指令時用的,而 renice 指令則是當你下完指令後,才想到要更改程序優先權時使用。一般使用者要使用 renice 指令只能將程序優先權降低,且一但降低後便不能再將它提高。而 super-user 則不受這些限制,並可針對使用者會或者是某個群體程序(process group)或者是某個程序做程序優先權的提高與降低。如果有非常重要的工作急著要提早執行完畢,你可以去求求 super-user 用 renice 來加速一下,你便可知道“電腦特權階級”的滋味!


mail.gif (2925 bytes)

b-line.gif (2092 bytes)