一、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
通過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
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的值。
總結:實時程序只考慮靜態優先順序;普通程序一般不需要太在意程序優先順序,因為核心會動態調整程序的優先順序。
程序排程的理解
程序排程可看做在可執行態程式之間分配有限的處理器時間資源的核心子系統。linux排程程式在2.5開始採用了一種o 1 排程程式 靜態時間片演算法和針對每一處理器的執行佇列 該排程演算法不適合那些響應時間敏感的程式 在2.6.23版本的排程程式中採用了 反轉樓梯最後期限排程演算法rsdl 即 完全公平...
linux程序排程
排程 從就緒的程序選出最適合的乙個來執行。知識點 1 排程策略 2 排程時機 3 排程步驟 排程策略 sched normal sched other 普通的分時程序 sched fifo 先入先出的實時程序 sched rr 時間片輪轉的實時程序 sched batch 批處理程序 sched i...
linux程序排程
搶占就是程序排程,使用者程序搶占發生在以下情況 1 從系統呼叫返回使用者空間的時候 2 從中斷處理程式返回使用者空間時。在時鐘中斷中會呼叫scheduler tick 函式,該函式在程序時間片用完的時候會設定need resched標誌,當從時鐘中斷或者其他中斷返回後檢查need resched,核...