為什么要有進程優先級?這似乎不用過多的解釋,畢竟自從多任務操作系統誕生以來,進程執行占用cpu的能力就是一個必須要可以人為控制的事情。因為有的進程相對重要,而有的進程則沒那么重要。進程優先級起作用的方式從發明以來基本沒有什么變化,無論是只有一個cpu的時代,還是多核cpu時代,都是通過控制進程占用cpu時間的長短來實現的。就是說在同一個調度周期中,優先級高的進程占用的時間長些,而優先級低的進程占用的短些。從這個角度看,進程優先級其實也跟cgroup的cpu限制一樣,都是一種針對cpu占用的QOS機制。我曾經一直很困惑一點,為什么已經有了優先級,還要再設計一個針對cpu的 cgroup?得到的答案大概是因為,優先級這個值不能很直觀的反饋出資源分配的比例吧?不過這不重要,實際上從內核目前的進程調度器cfs的角度說,同時實現cpushare方式的cgroup和優先級這兩個機制完全是相同的概念,并不會因為增加一個機制而提高什么實現成本。既然如此,而cgroup又顯得那么酷,那么何樂而不為呢?
再系統上我們最熟悉的優先級設置方式是nice喝renice命令。那么我們首先解釋一個概念,什么是:
NICE值
nice值應該是熟悉Linux/UNIX的人很了解的概念了,我們都知它是反應一個進程“優先級”狀態的值,其取值范圍是-20至19,一共40個級別。這個值越小,表示進程”優先級”越高,而值越大“優先級”越低。我們可以通過nice命令來對一個將要執行的命令進行nice值設置,方法是:
這樣我就又打開了一個bash,并且其nice值設置為10,而默認情況下,進程的優先級應該是從父進程繼承來的,這個值一般是0。我們可以通過nice命令直接查看到當前shell的nice值
對比一下正常情況:
推出當前nice值為10的bash,打開一個正常的bash:
另外,使用renice命令可以對一個正在運行的進程進行nice值的調整,我們也可以使用比如top、ps等命令查看進程的nice值,具體方法我就不多說了,大家可以參閱相關manpage。
需要大家注意的是,我在這里都在使用nice值這一稱謂,而非優先級(priority)這個說法。當然,nice和renice的man手冊中,也說的是priority這個概念,但是要強調一下,請大家真的不要混淆了系統中的這兩個概念,一個是nice值,一個是priority值,他們有著千絲萬縷的關系,但對于當前的Linux系統來說,它們并不是同一個概念。
我們看這個命令:
大家是否真的明白其中PRI列和NI列的具體含義有什么區別?同樣的,如果是top命令:
大家是否搞清楚了這其中PR值和NI值的差別?如果沒有,那么我們可以首先搞清楚什么是nice值。
nice值雖然不是priority,但是它確實可以影響進程的優先級。在英語中,如果我們形容一個人nice,那一般說明這個人的人緣比較好。什么樣的人人緣好?往往是謙讓、有禮貌的人。比如,你跟一個nice的人一起去吃午飯,點了兩個一樣的飯,先上了一份后,nice的那位一般都會說:“你先吃你先吃!”,這就是人緣好,這人nice!但是如果另一份上的很晚,那么這位nice的人就要餓著了。這說明什么?越nice的人搶占資源的能力就越差,而越不nice的人搶占能力就越強。這就是nice值大小的含義,nice值越低,說明進程越不nice,搶占cpu的能力就越強,優先級就越高。在原來使用O1調度的Linux上,我們還會把nice值叫做靜態優先級,這也基本符合nice值的特點,就是當nice值設定好了之后,除非我們用renice去改它,否則它是不變的。而priority的值在之前內核的O1調度器上表現是會變化的,所以也叫做動態優先級。
優先級和實時進程
簡單了解nice值的概念之后,我們再來看看什么是priority值,就是ps命令中看到的PRI值或者top命令中看到的PR值。本文為了區分這些概念,以后統一用nice值表示NI值,或者叫做靜態優先級,也就是用nice和renice命令來調整的優先級;而實用priority值表示PRI和PR值,或者叫動態優先級。我們也統一將“優先級”這個詞的概念規定為表示priority值的意思。
原文轉自:http://www.testwo.com/article/659