Linux的進程優(yōu)先級 NI 和 PR

為什么要有進程優(yōu)先級?

  • 這似乎不用過多的解釋,畢竟自從多任務(wù)操作系統(tǒng)誕生以來,進程執(zhí)行占用cpu的能力就是一個必須要可以人為控制的事情。因為有的進程相對重要,而有的進程則沒那么重要。
  • 進程優(yōu)先級起作用的方式從發(fā)明以來基本沒有什么變化,無論是只有一個cpu的時代,還是多核cpu時代,都是通過控制進程占用cpu時間的長短來實現(xiàn)的。
    就是說在同一個調(diào)度周期中,優(yōu)先級高的進程占用的時間長些,而優(yōu)先級低的進程占用的短些。

NI和PR

  • 請大家真的不要混淆了系統(tǒng)中的這兩個概念:nice(NI)和priority(PR),他們有著千絲萬縷的關(guān)系,但對于當前的Linux系統(tǒng)來說,它們并不是同一個概念
    我們看這個命令:
Paste_Image.png
  • 大家是否真的明白其中PRI列NI列的具體含義有什么區(qū)別?
    同樣的,如果是top命令:
Paste_Image.png
  • 大家是否搞清楚了這其中PR值NI值的差別?如果沒有,那么我們可以首先搞清楚什么是nice值。

什么是NICE值?

  • NICE值應(yīng)該是熟悉Linux/UNIX的人很了解的概念了,它是反應(yīng)一個進程“優(yōu)先級”狀態(tài)的值,其取值范圍是-20至19,一共40個級別。

  • 這個值越小,表示進程”優(yōu)先級”越高,而值越大“優(yōu)先級”越低。

  • 例如,我們可以通過NICE命令來對一個將要執(zhí)行的bash命令進行NICE值設(shè)置,方法是:

[root@zorrozou-pc0 zorro]# nice -n 10 bash
  • 這樣我就又打開了一個bash,并且其nice值設(shè)置為10,而默認情況下,進程的優(yōu)先級應(yīng)該是從父進程繼承來的,這個值一般是0。
    我們可以通過nice命令直接查看到當前shell的nice值:
[root@zorrozou-pc0 zorro]# nice10

對比一下正常情況:

[root@zorrozou-pc0 zorro]# exit

退出當前nice值為10的bash,打開一個正常的bash,我們查看下其 Nice值:

[root@zorrozou-pc0 zorro]# bash[root@zorrozou-pc0 zorro]# nice0
  • 另外,使用renice命令可以對一個正在運行的進程進行nice值的調(diào)整,我們也可以使用比如top、ps等命令查看進程的nice值,具體方法我就不多說了,大家可以參閱相關(guān)man page。
  • 需要大家注意的是,我在這里都在使用nice值這一稱謂,而非優(yōu)先級(priority)這個說法。nice值雖然不是priority,但是它確實可以影響進程的優(yōu)先級。
  • 在英語中,如果我們形容一個人nice,那一般說明這個人的人緣比較好。什么樣的人人緣好?往往是謙讓、有禮貌的人。
  • 比如,你跟一個nice的人一起去吃午飯,點了兩個一樣的飯,先上了一份后,nice的那位一般都會說:“你先吃你先吃!”,這就是人緣好,這人nice!但是如果另一份上的很晚,那么這位nice的人就要餓著了。
    這說明什么?
  • 越nice的人搶占資源的能力就越差,而越不nice的人搶占能力就越強。這就是nice值大小的含義,nice值越低,說明進程越不nice,搶占cpu的能力就越強,優(yōu)先級就越高(作者這個解釋太形象了,小編忍不住要手動點贊?。。?。
    在原來使用O1調(diào)度的Linux上,我們還會把nice值叫做靜態(tài)優(yōu)先級,這也基本符合nice值的特點,就是當nice值設(shè)定好了之后,除非我們用renice去改它,否則它是不變的。
    而priority的值在之前內(nèi)核的O1調(diào)度器上表現(xiàn)是會變化的,所以也叫做動態(tài)優(yōu)先級。
    什么是優(yōu)先級和實時進程?
  • 我們再來看看什么是priority值,就是ps命令中看到的PRI值或者top命令中看到的PR值。本文為了區(qū)分這些概念,以后:
  • 統(tǒng)一用nice值表示NI值,或者叫做靜態(tài)優(yōu)先級,也就是用nice和renice命令來調(diào)整的優(yōu)先級;
  • 而實用priority值表示PRI和PR值,或者叫動態(tài)優(yōu)先級。我們也統(tǒng)一將“優(yōu)先級”這個詞的概念規(guī)定為表示priority值的意思。

在內(nèi)核中,進程優(yōu)先級的取值范圍是通過一個宏定義的,這個宏的名稱是MAX_PRIO,它的值為140。
而這個值又是由另外兩個值相加組成的,一個是代表nice值取值范圍的NICE_WIDTH宏,另一個是代表實時進程(realtime)優(yōu)先級范圍的MAX_RT_PRIO宏。

說白了就是,Linux實際上實現(xiàn)了140個優(yōu)先級范圍,取值范圍是從0-139,這個值越小,優(yōu)先級越高。nice值的-20到19,映射到實際的優(yōu)先級范圍是100-139。
新產(chǎn)生進程的默認優(yōu)先級被定義為:

#define DEFAULT_PRIO   (MAX_RT_PRIO + NICE_WIDTH / 2)

實際上對應(yīng)的就是nice值的0。

  • 正常情況下,任何一個進程的優(yōu)先級都是這個值,即使我們通過nice和renice命令調(diào)整了進程的優(yōu)先級,它的取值范圍也不會超出100-139的范圍,除非這個進程是一個實時進程,那么它的優(yōu)先級取值才會變成0-99這個范圍中的一個。

  • 更多資料原文

  • 結(jié)合內(nèi)核態(tài)和用戶態(tài)有更深的體會和收獲

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 進程相關(guān)概念系統(tǒng)進程管理工具任務(wù)計劃 一、進程相關(guān)概念 定義:進程(Process)是運行中的程序的一個副本,是被...
    哈嘍別樣閱讀 661評論 0 0
  • 一個程序被加載到內(nèi)存當中運行,那么在內(nèi)存內(nèi)的那個數(shù)據(jù)就被稱為進程(process)。進程是操作系統(tǒng)上非常重要的概念...
    Zhang21閱讀 2,110評論 0 12
  • 1.如何讓查看linux系統(tǒng)上各程序的優(yōu)先級 命令如下: ps -efl 下面這2行是優(yōu)先等級 top top命...
    richard520閱讀 9,338評論 0 2
  • 自戀的媽媽會有如下九個特質(zhì): 第一,她對自身的重要性有著不切實際的理解。就是她總是覺得自己高人一等,總覺得自己做什...
    williie007閱讀 321評論 0 0
  • 【十歲男孩玩手游花掉一萬二,媽媽令其用家務(wù)和學習來“還債”】 具體的事件是因為男孩用媽媽的手機玩游戲的過程中用支付...
    鮑米花閱讀 305評論 0 0

友情鏈接更多精彩內(nèi)容