歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux進程優先級和nice值

Linux進程優先級和nice值

日期:2017/3/3 12:30:12   编辑:Linux技術

在學習了linux的完全公平調度算法(CFS)後,記錄下學習軌跡

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

我們可以通過ps -l看到當前正在運行的進程的詳細信息其中

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

R:表示進程當前的狀態UID:擁有該進程用戶的用戶ID

R:當前正在運行(RUNNING)

S:睡眠(SLEEP)

D:不可中斷

T:停止(STOP)

Z:僵屍進程(ZOMBIE)

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值給負值必須要用rootnice值不是優先級,但會影響優先級 PRI(new)=PRI(old)+nice

時間片過長會導致人機交互欠佳,而時間片過短會導致大量的處理器時間浪費在進程的切換上,而且I/O消耗型進程和處理器消耗型進程之間的處理器時間的不公平之處也顯現出來了CFS並沒有直接分配時間片到進程,而是將處理器的使用比劃分給了進程,這個比例還會受到nice值的影響

CFS的做法是允許每個進程運行一段時間,循環輪轉,選擇運行最少的進程作為寫一個運行進程,所以根據nice值的含義-占用處理器的百分比,來根據系統中全部可運行進程總數來根據所占比例的“時間片”運行linux設計總是想分配給N個進程每個進程同樣多的處理器運行時間,當N趨於無窮大的時候,按理說是可以分配給無限小的時間周期,但是這麼做會很糟糕,我們也無法分配無限小的時間周期,雖然越小的時間周期可以帶來更好的交互性,但還是帶來不可接受的切換消耗,所以引入了一個目標延遲,來模擬無限小調度周期的近似值,現在假設目標延遲就是20ms,用它除以所有當前可以運行的進程數目就可以得到每個進程獲得的時間片長度,當進程數無限大時候,每個進程分配的時間就趨於無限小,很好,進程切換又爆炸了,那麼如果把最小值設為為1ms呢,進程數目再多我也保證每個進程在被強占之前獲得1ms的運行時間,那麼這個1ms就被稱為最小粒度

然而最後影響CFS調度器調度進程的並不是優先級的nice值,因為CFS說了,我要讓每個進程獲得的處理器時間都是一樣的(雖然不可能),所以有一個vruntime的值表示進程運行的虛擬時間(就是在處理器上跑的時間累加和)這個vruntime值越小,說明該進程應該被優先執行(或者獲得更多的處理器時間片),因為他餓了。。。一次調度間隔的虛擬運行時間=實際運行時間*(NICE_0_LOAD/權重)這就是nice值和vruntime之間的關系,其中,NICE_0_LOAD是nice為0時的權重

當nice值為0證明虛擬運行時間=實際運行時間

Copyright © Linux教程網 All Rights Reserved