2010年11月13日 星期六

[Linux 小學堂] Linux 程序的執行順序 ( PRI , NICE )


Source (VBird:鳥哥)
我們知道 Linux 是多人多工的環境,由 top 的輸出結果我們也發現, 系統同時間有非常多的程序在運行中,只是絕大部分的程序都在休眠 (sleeping) 狀態而已。想一想,如果所有的程序同時被喚醒,那麼 CPU 應該要先處理那個程序呢?也就是說,那個程序被執行的優先序比較高?這就得要考慮到程序的優先執行序 (Priority) 與 CPU 排程囉!

Priority 與 Nice 值
我們知道 CPU 一秒鐘可以運作多達數 G 的微指令次數,透過核心的 CPU 排程可以讓各程序被 CPU 所切換運作, 因此每個程序在一秒鐘內或多或少都會被 CPU 執行部分的指令碼:

圖 3.3.1、並沒有優先順序的程序佇列示意圖

上圖中假設 pro1, pro2 是緊急的程序, pro3, pro4 是一般的程序,在這樣的環境中,由於不具有優先順序, 唉啊!pro1, pro2 還是得要繼續等待. 所以囉,我們想要將程序分優先順序啦!如果優先序較高則運作次數可以較多次,而不需要與較慢優先的程序搶位置!我們可以將程序的優先順序與 CPU 排程進行如下圖的解釋:


圖 3.3.2、具有優先順序的程序佇列示意圖

如上圖所示,具高優先權的 pro1, pro2 可以被取用兩次,而較不重要的 pro3, pro4 則運作次數較少。 如此一來 pro1, pro2 就可以較快被完成啦!要注意,上圖僅是示意圖,並非較優先者一定會被運作兩次啦! 為了要達到上述的功能,我們 Linux 給予程序一個所謂的『優先執行序 (priority, PRI)』, 這個 PRI 值越低代表越優先的意思。不過這個 PRI 值是由核心動態調整的, 使用者無法直接調整 PRI 值的:
tw-johnklee4:~ # ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 15191 15189 1 75 0 - 1035 wait pts/1 00:00:00 bash
0 R 0 15220 15191 0 77 0 - 545 - 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 指令。
This message was edited 4 times. Last update was at 14/11/2010 15:16:16

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...