關於程式的運行順序
我們知道 Linux 是多人多工的環境,由 top 的輸出結果我們也發現, 系統同時間有非常多的程式在運行中,只是絕大部分的程式都在休眠 (sleeping) 狀態而已。 想一想,如果所有的程式同時被喚醒,那麼 CPU 應該要先處理那個程式呢?也就是說,那個程式被啟動並執行優先序比較高? 這就得要考慮到程式的優先運行序 (Priority) 與 CPU 排程羅!
CPU 排程與前一章的例行性工作排程並不一樣。 CPU 排程指的是每支程式被 CPU 啟動並執行演算規則, 而例行性工作排程則是將某支程式安排在某個時間再交由系統運行。 CPU 排程與作業系統較具有相關性!
Priority 與 Nice 值
我們知道 CPU 一秒鐘可以運行多達數 G 的微命令次數,透過核心的 CPU 排程可以讓各程式被 CPU 所切換運行, 因此每個程式在一秒鐘內或多或少都會被 CPU 運行部分的命令碼。如果程式都是集中在一個佇列中等待 CPU 的運行, 而不具有優先順序之分,也就是像我們去遊樂場玩熱門遊戲需要排隊一樣,每個人都是照順序來! 你玩過一遍後還想再玩 (沒有運行完畢),請到後面繼續排隊等待。情況有點像底下這樣:
中假設 pro1, pro2 是緊急的程式, pro3, pro4 是一般的程式,在這樣的環境中,由於不具有優先順序, 唉啊!pro1, pro2 還是得要繼續等待而沒有優待呢!如果 pro3, pro4 的工作又臭又長!那麼緊急的 pro1, pro2 就得要等待個老半天才能夠完成!真麻煩啊!所以羅,我們想要將程式分優先順序啦!如果優先序較高則運行次數可以較多次, 而不需要與較慢優先的程式搶位置!我們可以將程式的優先順序與 CPU 排程進行如的解釋:
如所示,具高優先權的 pro1, pro2 可以被取用兩次,而較不重要的 pro3, pro4 則運行次數較少。 如此一來 pro1, pro2 就可以較快被完成啦!要注意,僅是,並非較優先者一定會被運行兩次啦! 為了要達到上述的功能,我們 Linux 給予程式一個所謂的『優先運行序 (priority, PRI)』, 這個 PRI 值越低代表越優先的意思。不過這個 PRI 值是由核心動態調整的, 使用者無法直接調整 PRI 值的。先來瞧瞧 PRI 曾在哪裡出現?
[root@www ~]# ps -lF S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD4 S 0 18625 18623 2 75 0 - 1514 wait pts/1 00:00:00 bash4 R 0 18653 18625 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 -lF S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD4 S 0 18625 18623 0 75 0 - 1514 wait pts/1 00:00:00 bash4 T 0 18676 18625 0 72 -5 - 1242 finish pts/1 00:00:00 vi4 R 0 18678 18625 0 77 0 - 1101 - pts/1 00:00:00 ps# 原本的 bash PRI 為 75 ,所以 vi 預設應為 75。不過由於給予 nice 為 -5 ,# 因此 vi 的 PRI 降低了!但並非降低到 70 ,因為核心還會動態調整![root@www ~]# kill -9 %1 <==測試完畢將 vi 關閉
就如同前面說的, nice 是用來調整程式的運行優先順序!這裡只是一個啟動並執行範例罷了! 通常什麼時候要將 nice 值調大呢?舉例來說,系統的背景工作中, 某些比較不重要的程式之進行:例如備份工作!由於備份工作相當的耗系統資源, 這個時候就可以將備份的命令之 nice 值調大一些,可以使系統的資源分派的更為公平!
renice :已存在程式的 nice 重新調整
[root@www ~]# renice [number] PID選項與參數:PID :某個程式的 ID 啊!範例一:找出自己的 bash PID ,並將該 PID 的 nice 調整到 10[root@www ~]# ps -lF S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD4 S 0 18625 18623 0 75 0 - 1514 wait pts/1 00:00:00 bash4 R 0 18712 18625 0 77 0 - 1102 - pts/1 00:00:00 ps[root@www ~]# renice 10 1862518625: old priority 0, new priority 10[root@www ~]# ps -lF S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD4 S 0 18625 18623 0 85 10 - 1514 wait pts/1 00:00:00 bash4 R 0 18715 18625 0 87 10 - 1102 - pts/1 00:00:00 ps
如果要調整的是已經存在的某個程式的話,那麼就得要使用 renice 了。使用的方法很簡單, renice 後面接上數值及 PID 即可。因為後面接的是 PID ,所以你務必要以 ps 或者其他程式觀察的命令去找出 PID 才行啊!
由上面這個範例當中我們也看的出來,雖然修改的是 bash 那個程式,但是該程式所觸發的 ps 命令當中的 nice 也會繼承而為 10 喔!瞭解了吧!整個 nice 值是可以在父程式 --> 子程式之間傳遞的呢! 另外,除了 renice 之外,其實那個 top 同樣的也是可以調整 nice 值的!
轉自 http://vbird.dic.ksu.edu.tw/linux_basic/0440processcontrol_3.php#dmesg