進程調度是linux中很是重要的概念。linux內核有一套高效複雜的調度機制,能使效率極大化,但有時爲了實現特定的要求,須要必定的人工干預。好比,你但願操做系統能分配更多的CPU資源給瀏覽器進程,讓瀏覽速度更快、更流暢,操做體驗更好。那具體應該怎麼作呢?儘管linux的進程調度算法十分複雜,但都是以進程的優先級爲基礎的。所以,只須要改變進程的優先級便可。linux
在linux中,nice
命令用於改變進程的優先級。算法
nice
命令?什麼鬼?哪有命令直接說本身「nice」的?咋一看,這個名字確實很「nice」,只是這裏的「nice」是指「niceness」,即友善度、謙讓度。用於進程中,表示進程的優先級,也即進程的友善度。niceness值爲負時,表示高優先級,能提早執行和得到更多的資源,對應低友善度;反之,則表示低優先級,高友善度。瀏覽器
nice
命令格式:nice [OPTION] [COMMAND [ARG]...]
。ruby
當nice沒有選項時,輸出值表示系統進程缺省的niceness值,通常爲0。bash
xie@xie-VirtualBox:~$ nice 0
當nice
命令中沒有給出具體的niceness值時,默認爲10。如nice vi
設置vi進程的niceness爲10。ui
-n
選項後面跟具體的niceness值。niceness值的範圍-20~19,小於-20或大於19的值分別記爲-20和19。spa
xie@xie-VirtualBox:~$ nice -n 10 vi&
該命令設置vi進程的niceness值爲10,也就是較低的優先級。操作系統
若是設置的niceness值爲負,那麼必需要有管理員權限。這也不難理解,當niceness爲負時,意味着該進程要搶佔其餘進程的資源,必需要有權限才行;若是niceness爲正,即表示謙讓度高,這對其餘進程來講是喜聞樂見的,也固然就不用權限認證了。code
能夠經過ps -l
查看進程的niceness值。進程
xie@xie-VirtualBox:~$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 1635 1634 0 80 0 - 2178 wait pts/13 00:00:00 bash 0 T 1000 1677 1635 0 90 10 - 1767 signal pts/13 00:00:00 vi 0 R 1000 1678 1635 0 80 0 - 1606 - pts/13 00:00:00 ps
NI列即表示進程的niceness值。vi進程對應的NI值正好爲剛設置的10。那PRI列又是什麼呢?PRI表示進程當前的總優先級,值越小表示優先級越高,由進程默認的PRI加上NI獲得,即PRI(new) = PRI(old) + NI。由上程序,進程默認的PRI是80,因此加上值爲10的NI後,vi進程的PRI爲90。
因此,須要注意的是,NI即niceness的值只是進程優先級的一部分,不能徹底決定進程的優先級,但niceness值的絕對值越大,效果越顯著。
--adjustment選項和-n選項的效果是同樣的,在等號右邊設置對應的niceness值便可。
xie@xie-VirtualBox:~$ nice --adjustment=16 vi& [1] 1681 xie@xie-VirtualBox:~$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 1635 1634 0 80 0 - 2178 wait pts/13 00:00:00 bas 0 T 1000 1681 1635 0 96 16 - 1767 signal pts/13 00:00:00 vi 0 R 1000 1682 1635 0 80 0 - 1606 - pts/13 00:00:00 ps
注意,直接使用「-N」也能夠設置niceness值。好比,nice -12 vi&
將vi的niceness值設置爲12,若是是nice --12 vi&
的話,則設置niceness的值爲-12。這很容易混淆,建議使用-n或--adjustment選項,不易出錯。
--help 顯示幫助信息 --version 顯示版本信息
以上討論的都是爲即將運行的進程設置niceness值,而renice
用於改變正在運行的進程的niceness值。
renice
,字面意思即從新設置niceness值,進程啓動時默認的niceness值爲0,能夠用renice更新。
renice
語法:renice
[優先等級][
-g<程序羣組名稱>...][
-p<程序識別碼>...][-u <用戶名稱>...]
如:
renice -5 -p 5200 #將PID爲5200的進程的niceness設爲-5 renice -5 -u xie #將屬於用戶xie的進程的niceness設爲-5 renice -5 -g group1 #將屬於group1組的程序的niceness設爲5