我們知道 CPU 一秒鐘可以運行多達數 G 的微命令次數,透過核心的 CPU 排程可以讓各程序被 CPU 所切換運行, 因此每個程序在一秒鐘內或多或少都會被 CPU 運行部分的命令碼。如果程序都是集中在一個對列中等待 CPU 的運行,而不具有優先順序之分。如下圖所示:
圖 3.3.1、沒有優先順序的程序隊列示意圖
上圖中假設 pro1, pro2 是緊急的程序, pro3,pro4 是一般的程序,在這樣的環境中,由於不具備優先權次序, 因此pro1, pro2要繼續等待。如果 pro3, pro4 的工作太長!那麼緊急的 pro1, pro2 就得要等待ro3, pro4完成才能夠完成!所以我們想要將程序分優先順序!如果優先序較高則運行次數可以較多次, 而不需要與較慢優先的程序搶位置!我們可以將程序的優先順序與 CPU 排程進行如下圖的解釋:
圖 3.3.2、具有優先順序的程序佇列示意圖
如上圖所示,具高優先權的 pro1, pro2 可以被取用兩次,而較不重要的 pro3, pro4 則運行次數較少。 如此一來 pro1, pro2 就可以較快被完成!要注意,上圖僅是示意圖,並非較優先者一定會被運行兩次!爲了要達到上述的功能,我們 Linux 給予程序一個所謂的優先運行序(priority, PRI), 這個 PRI 值越低代表越優先的意思。不過這個 PRI 值是由核心動態調整的, 使用者無法直接調整 PRI 值的。先來瞧瞧 PRI 曾在哪裏出現:
[root@www ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1862518623 2 75 0 - 1514 wait pts/1 00:00:00 bash
4 R 0 1865318625 0 77 0 - 1102 - pts/1 00:00:00 ps
由於PRI 是核心動態調整的,我們使用者也無權去幹涉 PRI !那如果你想要調整程序的優先運行序時,就得要透過 Nice 值了!Nice 值就是上表的NI 啦!一般來說, PRI 與 NI 的相關性如下:
PRI(new) = PRI(old) + nice
不過你要特別留意到,如果原本的 PRI 是 50 ,並不是我們給予一個nice = 5 ,就會讓 PRI 變成 55 喔!因爲 PRI 是系統『動態』決定的,所以,雖然 nice 值是可以影響 PRI ,不過, 最終的 PRI 仍是要經過系統分析後纔會決定的。另外, nice 值是有正負的,而既然 PRI 越小越早被運行, 所以,當 nice 值爲負值時,那麼該程序就會降低 PRI 值,亦即會變的較優先被處理。此外,你必須要留意到:
- nice 值可調整的範圍爲 -20 ~ 19 ;
- root 可隨意調整自己或他人程序的 Nice 值,且範圍爲 -20 ~ 19 ;
- 一般使用者僅可調整自己程序的 Nice 值,且範圍僅爲 0 ~ 19 (避免一般用戶搶佔系統資源);
- 一般使用者僅可將 nice 值越調越高,例如本來 nice 爲 5 ,則未來僅能調整到大與 5;
這也就是說,要調整某個程序的優先運行序,就是調整該程序的 nice 值!那麼如何給予某個程序 nice 值呢?有兩種方式,分別是:
- 一開始運行程序就立即給予一個特定的 nice 值:用 nice 命令;
- 調整某個已經存在的 PID 的 nice 值:用 renice 命令。
- nice :新運行的命令即給予新的 nice 值
[root@www ~]# nice [-n 數字] command
選項與參數:
-n :後面接一個數值,數值的範圍 -20 ~ 19。
範例一:用 root 給一個nice 值爲 -5 ,用於運行 vi ,並觀察該程序!
[root@www ~]# nice -n -5 vi &
[1] 18676
[root@www ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1862518623 0 75 0 - 1514 wait pts/1 00:00:00 bash
4 T 0 1867618625 0 72 -5 - 1242 finish pts/1 00:00:00 vi
4 R 0 1867818625 0 77 0 - 1101 - pts/1 00:00:00 ps
# 原本的 bash PRI 爲 75 ,所以 vi 默認應爲 75。不過由於給予 nice 爲 -5 ,
# 因此 vi 的 PRI 降低了!但並非降低到70 ,因爲核心還會動態調整!
[root@www ~]# kill -9 18676 <==測試完畢將 vi 關閉
就如同前面說的, nice 是用來調整程序的運行優先順序! 通常什麼時候要將 nice 值調大呢?舉例來說,系統的背景工作中, 某些比較不重要的程序執行:例如備份工作!由於備份工作相當的耗系統資源,這個時候就可以將備份的命令之 nice 值調大一些,可以使系統的資源分配的更爲公平!
- renice :已存在程序的 nice 重新調整
[root@www ~]# renice [number] PID
選項與參數:
PID :某個程序的 ID 啊!
範例一:找出自己的 bash PID ,並將該 PID 的 nice 調整到 10
[root@www ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1862518623 0 75 0 - 1514 wait pts/1 00:00:00 bash
4 R 0 1871218625 0 77 0 - 1102 - pts/1 00:00:00 ps
[root@www ~]# renice 10 18625
18625: old priority 0, new priority 10
[root@www ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1862518623 0 85 10 - 1514 wait pts/1 00:00:00 bash
4 R 0 1871518625 0 87 10 - 1102 - pts/1 00:00:00 ps
如果要調整的是已經存在的某個程序的話,那麼就得要使用 renice 了。使用的方法很簡單, renice 後面接上數值及 PID 即可。因爲後面接的是 PID ,所以你務必要以 ps 或者其他程序觀察的命令去找出 PID 才行啊!
由上面這個範例當中我們也看的出來,雖然修改的是 bash 那個程序,但是該程序所觸發的 ps 命令當中的 nice 也會繼承而爲 10 喔!瞭解了吧!整個 nice 值是可以在父程序 --> 子程序之間傳遞的呢! 另外,除了 renice 之外,其實那個top 同樣的也是可以調整 nice 值的!