先看看一張笨叔叔《奔跑吧linux核心》扣的圖,從這張圖中我們可以看到乙個程序的所有狀態:
描述建立態
建立了新的程序(新程序)
就緒態程序獲得了可以執行的所有資源和準備條件(task_running)
執行態程序正在cpu中執行 (task_running)
阻塞態程序因為等待某項資源而被暫時移出了cpu (task_interruptible或task_uninterruptible)
終止態程序消亡(exit_zombie或__task_stopped)
在核心原始碼/include/linux/sched.h 定義如下,通過task->state可以判斷程序狀態:
#define task_running 0
#define task_interruptible 1
#define task_uninterruptible 2
#define __task_stopped 4
#define __task_traced 8
/* in tsk->exit_state */
#define exit_dead 16
#define exit_zombie 32
#define exit_trace (exit_zombie | exit_dead)
/* in tsk->state again */
#define task_dead 64
#define task_wakekill 128
#define task_waking 256
#define task_parked 512
#define task_noload 1024
#define task_state_max 2048
task_running:它表示的是程序處於可執行狀態,或許正在執行,或許在就緒佇列中等待執行,表示的是執行態和就緒態的乙個集合;
task_interruptible(可中斷睡眠態):
程序進入睡眠狀態(被阻塞)來等待某些條件的達成或者某些資源的就位,一旦條件達成或者是資源就位,核心把狀態設定位task_running並將其加入就緒佇列中;
task_uninterruptible(不可中斷態):
程序在睡眠等待時不受干擾,對訊號不做任何反應,ps命令可以檢視程序state 為d,不可以傳送sigkill訊號使他們終止;
__task_stoppid(終止態):
程序停止執行;
exit_zomile(殭屍態):
程序已經消亡,但是task_struct資料結構沒有被釋放,這個狀態叫做殭屍態,每個程序在它的生命週期都要經歷這個狀態,子程序退出時,父程序可以通過wait或者waitpid()來獲取子程序消亡的原因;
在linux中可以ps -aux檢視程序state:
狀態字對應的程序狀態:
state
說明r(執行狀態 running)
並不意味著程序一定在執行中,也可以在執行佇列裡
s(睡眠狀態 sleeping)
程序在等待事件完成(淺度睡眠可被喚醒)
d(不可中斷睡眠狀態 uninterrupt sleep)
不可中斷睡眠(深度睡眠,不可被喚醒,通常在磁碟寫入時發生)
t (停止狀態 stopped)
可以傳送sigstop訊號給程序來停止程序,可以傳送sigcont訊號讓程序繼續執行
x(死亡狀態 dead)
該狀態是反回狀態,在任務列表中看不到
z(殭屍狀態 zombie)
子程序退出,父程序還在執行,但是父程序沒有讀到子程序的退出狀態,子程序進入殭屍狀態
<
優先順序高的程序
n優先順序較低的程序
l有些頁被鎖進記憶體
s在它之下還有子程序
l多程序(使用clone_thread,類似nptl pthreads)
+位於後台的程序組
Linux程序剖析
linux系統下程式所處的環境 a 執行於使用者空間,執行使用者程序。b 執行於核心空間,處於程序上下文中,代表某個特定的程序執行。c 執行於核心空間,處於中斷上下文中,與任何程序無關,代表硬體執行於核心空間,處理某個特定的中斷。通過系統呼叫,使用者空間的應用程式就會進入核心空間,由核心代表該程序執...
linux 程序 狀態
程序在執行過程中會根據環境來改變state。linux程序有以下狀態 running 程序處於執行 它是系統的當前程序 或者準備執行狀態 它在等待系統將cpu分配給它 waiting 程序在等待乙個事件或者資源。linux將等待程序分成兩類 可中斷與不可中斷。可中斷等待程序可以被訊號中斷 不可中斷等...
linux程序狀態
1.r task running,正在執行或者處於就緒狀態 很多作業系統教科書將正在cpu上執行的程序定義為running狀態 而將可執行但是尚未被排程執行的程序定義為ready狀態,這兩種狀態在linux下統一為 task running狀態。例子 ps aux 會看到ps這個程式命令的執行狀態是...