1、Linux進程的R、S、D、T、Z、X狀態算法
R(TASK_RUNNING):進程處於ready狀態,及可執行狀態ide
S(TASK_INTERRUPTIBLE):能夠中斷的睡眠狀態spa
D(TASK_UNINTERRUPTIBLE):不可中斷的睡眠狀態,不多見調試
T(TASK_STOPPED or TASK_TRACED):暫停或者跟蹤狀態,收到sigstopt信號變爲暫停狀態,收到sigcont變爲running狀態;gdb調試及跟蹤狀態orm
Z(TASK_DEAD-TASK_ZOMBIE):退出狀態,進程稱爲殭屍進程(子進程退出)blog
X(TASK_DEAD-EXIT_DEAD):退出狀態,進程即將被銷燬(一個進程cancel另外一個進程)接口
在平時工做中其中R和S最多見,當進程接受消息隊列,sleep等,進程處於阻塞狀態(S)。隊列
通常狀態變化,R-S,S-R進程
經過ps -l查看進程狀態 s(state)那列消息隊列
2、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的值。
總結:實時進程只考慮靜態優先級;普通進程通常不須要太在乎進程優先級,由於內核會動態調整進程的優先級。