CPU進程優先級


一.簡介

進程優先級起作用的方式從發明以來基本沒有什么變化,無論是只有一個cpu的時代,還是多核cpu時代,都是通過控制進程占用cpu時間的長短來實現的。就是說在同一個調度周期中,優先級高的進程占用的時間長些,而優先級低的進程占用的短些。

在系統上我們最熟悉的優先級設置方式是nice和renice命令。

二.NICE值

nice值應該是熟悉Linux/UNIX的人很了解的概念了,我們都知它是反應一個進程“優先級”狀態的值,其取值范圍是40-20至19-0,一共40個級別。這個值越小,表示進程”優先級”越高,而值越大“優先級”越低。

我們可以通過nice命令來對一個將要執行的命令進行nice值設置,方法是:

另外,使用renice命令可以對一個正在運行的進程進行nice值的調整,我們也可以使用比如top、ps等命令查看進程的nice值,具體方法我就不多說了,大家可以參閱相關manpage。

需要大家注意的是,我在這里都在使用nice值這一稱謂,而非優先級(priority)這個說法。當然,nice和renice的man手冊中,也說的是priority這個概念,但是要強調一下,請大家真的不要混淆了系統中的這兩個概念,一個是nice值,一個是priority值,他們有着千絲萬縷的關系,但對於當前的Linux系統來說,它們並不是同一個概念。

大家是否搞清楚了這其中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就是top中的NI值

在內核中,進程優先級的取值范圍是140個優先級范圍,取值范圍是從0-139,這個值越小,優先級越高。nice值的40-20到19-0,映射到實際的優先級范圍是100-139。

正常情況下,任何一個進程的優先級都是這個值,即使我們通過nice和renice命令調整了進程的優先級,它的取值范圍也不會超出100-139的范圍,除非這個進程是一個實時進程,那么它的優先級取值才會變成0-99這個范圍中的一個。這里隱含了一個信息,就是說當前的Linux是一種已經支持實時進程的操作系統。

簡單來說,實時操作系統需要保證相關的實時進程在較短的時間內響應,不會有較長的延時,並且要求最小的中斷延時和進程切換延時。對於這樣的需求,一般的進程調度算法,無論是O1還是CFS都是無法滿足的,所以內核在設計的時候,將實時進程單獨映射了100個優先級,這些優先級都要高與正常進程的優先級(nice值),這樣就可以保證實時進程遇險記最高,總是排在前面被處理。

而實時進程的調度算法也不同,它們采用更簡單的調度算法來減少調度開銷。總的來說,Linux系統中運行的進程可以分成兩類:

四.實時進程

非實時進程
它們的主要區別就是通過優先級來區分的。所有優先級值在0-99范圍內的,都是實時進程,而100-139范圍內的是非實時進程。在系統中可以使用chrt命令來查看、設置一個進程的實時優先級狀態。我們可以先來看一下chrt命令的使用:


我們先來關注顯示出的Policy options部分,會發現系統給個種進程提供了5種調度策略。但是這里並沒有說明的是,這五種調度策略是分別給兩種進程用的,對於實時進程可以用的調度策略是:SCHED_FIFO、SCHED_RR,而對於非實時進程則是:SCHED_OTHER、SCHED_OTHER、SCHED_IDLE。

系統的整體優先級策略是:如果系統中存在需要執行的實時進程,則優先執行實時進程。直到實時進程退出或者主動讓出CPU時,才會調度執行非實時進程。實時進程可以指定的優先級范圍為1-99,將一個要執行的程序以實時方式執行的方法為:

剛才說過,SCHED_RR和SCHED_FIFO都是實時調度策略,只能給實時進程設置。對於所有實時進程來說,優先級高的(就是priority數字小的)進程一定會保證先於優先級低的進程執行。SCHED_RR和SCHED_FIFO的調度策略只有當兩個實時進程的優先級一樣的時候才會發生作用,其區別也是顧名思義:

SCHED_FIFO:以先進先出的隊列方式進行調度,在優先級一樣的情況下,誰先執行的就先調度誰,除非它退出或者主動釋放CPU。

SCHED_RR:以時間片輪轉的方式對相同優先級的多個進程進行處理。時間片長度為100ms。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM