測試

一、Linux進程的R、S、D、T、Z、X狀態

R(TASK_RUNNING):進程處於ready狀態,及可執行狀態

S(TASK_INTERRUPTIBLE):可以中斷的睡眠狀態

D(TASK_UNINTERRUPTIBLE):不可中斷的睡眠狀態,很少見

T(TASK_STOPPED or TASK_TRACED):暫停或者跟蹤狀態,收到sigstopt信號變爲暫停狀態,收到sigcont變爲running狀態;gdb調試及跟蹤狀態

Z(TASK_DEAD-TASK_ZOMBIE):退出狀態,進程稱爲殭屍進程(子進程退出)

X(TASK_DEAD-EXIT_DEAD):退出狀態,進程即將被銷燬(一個進程cancel另一個進程)

在平時工作中其中R和S最常見,當進程接受消息隊列,sleep等,進程處於阻塞狀態(S)。

一般狀態變化,R-S,S-R

二、Linux提供兩種優先級:普通進程優先級、實時進程優先級

實時進程優先級

實時優先級採用兩種調度算法:SCHED_FIFO(先入先出調度算法)、SCHED_RR(時間片輪詢調度算法)

實時優先級調度特點:只有靜態優先級,不會調整優先級,默認優先級0-99(MAX_RT_PRIO=100)。nice值隻影響100~100+40的進程優先級.

總結:對FIFO,只有當進程執行完畢才能輪到其他進程執行

對RR,一旦時間片消耗完,則將該進程放到隊列末端,其他進程才能執行。

普通進程優先級

普通優先級採用的調度算法:SCHED_NORMAL(CFS調度器實現)

普通優先級調度特點:根據動態優先級調度,動態優先級由靜態優先級調整而來。靜態優先級由內核隱藏,但是提供接口:由nice值計算得到:

static_prio = MAX_RT_PRIO(默認100)+ nice +20

nice取值範圍是 -20~19,所以靜態優先級100~139

並且進程時間片也是有靜態優先級得到:

If( static_prio < 120 )

    time = ( 140 – static_prio )*20

else if( static_prio >= 120)

    time = ( 140 –static_prio )*5

動態優先級主要考慮的兩個因素:靜態優先級和進程平均運行時間bouns值,計算公式:

dynamic_prio = max( 100,min(static_prio-bouns+5 ,139)

bouns值的大小0-10,當大於5表示優先級提高,當小於5時優先級變低;Linux內核會根據進程的平均運行時間動態的改變進程的動態優先級。一般來說,交互式進程的平均運行時間比較長,因此Linux內核會獎勵從而增加bouns的值。

總結:實時進程只考慮靜態優先級;普通進程一般不需要太在意進程優先級,因爲內核會動態調整進程的優先級。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章