天天看點

linux+nice值與優先級,Linux程序優先級和nice值

在學習了linux的完全公平排程算法(CFS)後,記錄下學習軌迹

這篇文章主要講述,完全公平排程算法的工作方式,和一些排程知識

linux+nice值與優先級,Linux程式優先級和nice值

我們可以通過ps -l看到目前正在運作的程序的詳細資訊其中

F:表示程序旗标,辨別程序所擁有的權限,當我切換到root的時候為4表示擁有root權限,為1僅有fork()權限

R:表示程序目前的狀态

R:目前正在運作(RUNNING)

S:睡眠(SLEEP)

D:不可中斷

T:停止(STOP)

Z:僵屍程序(ZOMBIE)

UID:擁有該程序使用者的使用者ID

PID:程序号

PPID:該程序父程序的程序好

C:CPU是用百分比

PRI:優先級

NI:nice值

ADDR/SZ/WCHAN:都與記憶體有關

TTY:登陸者的終端,和遠端登陸脫不開幹系

TIME:占用CPU時間

CMD:造成此程序的指令

這次講的重點主要和PRI還有NI有關

我們把主要程序分為兩種:1.I/O消耗型程序;2.處理器消耗型程序             當然也有既是I/O消耗型也是處理器消耗型的程序

I/O消耗型程序如字面意思一樣,輪到它的時候會把大部分時間消耗在I/O請求和等待I/O上,真正使用CPU的時間很少,處理器消耗性程序會把大部分時間用在使用CPU進行計算之類的,如果給這兩種繼承配置設定的時間片長度相等,就會展現出不公平。

同時我們想給處理器消耗型的程序多一些處理器時間,而給I/O消耗性程序少一些處理器時間,于是linux采取的不是簡單的時間片排程算法,而是改進的優先級排程算法CFS

Linux系統是搶占式的,什麼概念呢,系統目前運作一個程序,但這個時候一個具有更高優先級的程序突然得到某種資源進入了就緒狀态,然後他就來到cpu面前一腳踢開正在運作的程序(你奏凱,我先來)就搶奪了與CPU共度的美好時光。。。

CFS直接配置設定的不是時間片,而是CPU使用比,這個比例會收到nice值得影響,然後你懂,nice值低比重就高,nice高比重就低

Q:Linux使用的CFS排程器,決定搶占時機的就是上面說的CPU使用比,注意!反而CPU使用比低的新程序會立刻投入運作,CPU使用比高的新程序會延遲運作,為什麼呢

A:因為CFS的出發點基于一個非常簡單的概念:程序排程的效果應如同系統具備一個理想中的完美多任務處理器。在這種系統中每個程序将能獲得1/n的處理器時間

就是說每個程序真正使用cpu的時間是一樣的,包括I/O消耗型和處理器消耗型,以達到真正的公平,這就解釋了剛才的問題,CPU使用比低的占用時間會不可避免的少于占用比高的程序,那我們隻好讓這個程序具有搶占能力,一就緒就可以搶占,這樣子“看起來CPU使用比高了”(其實沒變)“看起來CPU占用時間也和其他程序一樣多了”(其實不多)

搶占能力高了,互動性相對而言就好了,你看你人打個遊戲,互動性就得高,不然你按個鍵放個技能電腦不給你處理,你就坑隊友了

Linux采用的是完全公平排程算法(CFS)

Linux的程序排程并未使用直接均分時間片的方式,而是對優先級進行了改進,采用了兩種不同的優先級範圍,一種是nice值,範圍是-20到+19,越大的nice值意味着更低的優先級,低nice值的程序會獲得更多的處理器時間(按比例獲得),第二種範圍是實時優先級,其值是可配置的,預設情況下它的變化範圍是從0到99,與nice值意義相反,越高的實時優先級數值意味着程序優先級越高,任何實時程序的優先級都高于普通程序

PS:nice值還會不斷對old優先級進行更改,當然也可以設定nice的值,nice值給負值必須要用root

nice值不是優先級,但會影響優先級 PRI(new)=PRI(old)+nice

時間片過長會導緻人機互動欠佳,而時間片過短會導緻大量的處理器時間浪費在程序的切換上,而且I/O消耗型程序和處理器消耗型程序之間的處理器時間的不公平之處也顯現出來了

CFS并沒有直接配置設定時間片到程序,而是将處理器的使用比劃分給了程序,這個比例還會受到nice值的影響

CFS的做法是允許每個程序運作一段時間,循環輪轉,選擇運作最少的程序作為寫一個運作程序,是以根據nice值的含義-占用處理器的百分比,來根據系統中全部可運作程序總數來根據所占比例的“時間片”運作

linux設計總是想配置設定給N個程序每個程序同樣多的處理器運作時間,當N趨于無窮大的時候,按理說是可以配置設定給無限小的時間周期,但是這麼做會很糟糕,我們也無法配置設定無限小的時間周期,雖然越小的時間周期可以帶來更好的互動性,但還是帶來不可接受的切換消耗,是以引入了一個目标延遲,來模拟無限小排程周期的近似值,現在假設目标延遲就是20ms,用它除以所有目前可以運作的程序數目就可以得到每個程序獲得的時間片長度,當程序數無限大時候,每個程序配置設定的時間就趨于無限小,很好,程序切換又爆炸了,那麼如果把最小值設為為1ms呢,程序數目再多我也保證每個程序在被強占之前獲得1ms的運作時間,那麼這個1ms就被稱為最小粒度