Linux的進程優先級(2)

發表于:2016-05-10來源:測試窩作者:鄒立巍點擊數: 標簽:linux
在內核中,進程優先級的取值范圍是通過一個宏定義的,這個宏的名稱是MAX_PRIO,它的值為140。而這個值又是由另外兩個值相加組成的,一個是代表nice值取

  在內核中,進程優先級的取值范圍是通過一個宏定義的,這個宏的名稱是MAX_PRIO,它的值為140。而這個值又是由另外兩個值相加組成的,一個是代表nice值取值范圍的NICE_WIDTH宏,另一個是代表實時進程(realtime)優先級范圍的MAX_RT_PRIO宏。說白了就是,Linux實際上實現了140個優先級范圍,取值范圍是從0-139,這個值越小,優先級越高。nice值的-20到19,映射到實際的優先級范圍是100-139。新產生進程的默認優先級被定義為:

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

  什么是實時操作系統,我們就不再這里詳細解釋其含義以及在工業領域的應用了,有興趣的可以參考一下實時操作系統的維基百科。簡單來說,實時操作系統需要保證相關的實時進程在較短的時間內響應,不會有較長的延時,并且要求最小的中斷延時和進程切換延時。對于這樣的需求,一般的進程調度算法,無論是O1還是CFS都是無法滿足的,所以內核在設計的時候,將實時進程單獨映射了100個優先級,這些優先級都要高與正常進程的優先級(nice值),而實時進程的調度算法也不同,它們采用更簡單的調度算法來減少調度開銷??偟膩碚f,Linux系統中運行的進程可以分成兩類:

  實時進程

  非實時進程

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

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

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

  可以看到,新打開的bash已經是實時進程,默認調度策略為SCHED_RR,優先級為10。如果想修改調度策略,就加個參數:

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

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

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

  這就是Linux對于實時進程的優先級和相關調度算法的描述。整體很簡單,也很實用。而相對更麻煩的是非實時進程,它們才是Linux上進程的主要分類。對于非實時進程優先級的處理,我們首先還是要來介紹一下它們相關的調度算法:O1和CFS。

  O1調度

  O1調度算法是在Linux 2.6開始引入的,到Linux 2.6.23之后內核將調度算法替換成了CFS。雖然O1算法已經不是當前內核所默認使用的調度算法了,但是由于大量線上的服務器可能使用的Linux版本還是老版本,所以我相信很多服務器還是在使用著O1調度器,那么費一點口舌簡單交代一下這個調度器也是有意義的。這個調度器的名字之所以叫做O1,主要是因為其算法的時間復雜度是O1。

原文轉自:http://www.testwo.com/article/659

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97