Linux 程序狀態剖析

2021-10-12 20:20:34 字數 2108 閱讀 1693

先看看一張笨叔叔《奔跑吧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這個程式命令的執行狀態是...