一、Linux進程的R、S、D、T、Z、X狀態
R(TASK_RUNNING):進程處于ready狀態,及可執行狀態
S(TASK_INTERRUPTIBLE):可以中斷的睡眠狀態
D(TASK_UNINTERRUPTIBLE):不可中斷的睡眠狀態,很少見
T(TASK_STOPPED or TASK_TRACED):暫?;蛘吒櫊顟B,收到sigstopt信號變為暫停狀態,收到sigcont變為running狀態;gdb調試及跟蹤狀態
Z(TASK_DEAD-TASK_ZOMBIE):退出狀態,進程稱為僵尸進程(子進程退出)
X(TASK_DEAD-EXIT_DEAD):退出狀態,進程即將被銷毀(一個進程cancel另一個進程)
在平時工作中其中R和S最常見,當進程接受消息隊列,sleep等,進程處于阻塞狀態(S)。
一般狀態變化,R-S,S-R
通過ps -l查看進程狀態 s(state)那列

二、Linux提供兩種優先級:普通進程優先級、實時進程優先級
1、? 實時進程優先級
實時優先級采用兩種調度算法:SCHED_FIFO(先入先出調度算法)、SCHED_RR(時間片輪詢調度算法)
實時優先級調度特點:只有靜態優先級,不會調整優先級,默認優先級0-99(MAX_RT_PRIO=100)。nice值只影響100~100+40的進程優先級.
總結:對FIFO,只有當進程執行完畢才能輪到其他進程執行
對RR,一旦時間片消耗完,則將該進程放到隊列末端,其他進程才能執行。
2、? 普通進程優先級
普通優先級采用的調度算法: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的值。
總結:實時進程只考慮靜態優先級;普通進程一般不需要太在意進程優先級,因為內核會動態調整進程的優先級。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。