前言
????????在Linux系統中,進程是資源分配和調度的基本單位,而進程狀態則是理解進程行為的關鍵。從運行中的任務(
TASK_RUNNING
)到僵尸進程(EXIT_ZOMBIE
),每個狀態都反映了進程在內核調度、資源等待或父子進程交互中的不同階段。
目錄
一、基本進程狀態(靜態視圖)
(1) 運行狀態(R - Running/TASK_RUNNING)
(2) 可中斷睡眠(S - Interruptible Sleep/TASK_INTERRUPTIBLE)
(3) 不可中斷睡眠(D - Uninterruptible Sleep/TASK_UNINTERRUPTIBLE)
(4) 停止狀態(T - Stopped/TASK_STOPPED)
(5)跟蹤狀態(T - Tracing Stop)?
(6) 僵尸狀態(Z - Zombie/EXIT_ZOMBIE)
(7) 死亡狀態(X - Dead/EXIT_DEAD)
二、其他擴展狀態(動態視圖)
(1) t (TASK_TRACED,被跟蹤狀態)
(2) I (IDLE,空閑狀態)
三、特殊狀態(非標準進程狀態)
一、基本進程狀態(靜態視圖)
????????要理解正在運行的進程,首先需要了解進程的不同狀態。在Linux內核中,進程有時也被稱為任務。以下狀態在kernel源代碼中有明確定義:array.c - fs/proc/array.c - Linux 源代碼 v6.14.8 - Bootlin Elixir 交叉引用器
????????Linux進程狀態主要定義在/include/linux/sched.h
中,常見狀態包括:?(由于Linux內核版本的不同,每個版本對應的對進程狀態定義的源代碼就不同,就以下面幾種常見狀態進行講解)
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char *task_state_array[] = {"R (running)", /* 0*/"S (sleeping)", /* 1*/"D (disk sleep)", /* 2*/"T (stopped)", /* 4*/"T (tracing stop)", /* 8*/"Z (zombie)", /* 16*/"X (dead)" /* 32*/
};
如上,進程狀態就是task_struct內的一個整數,每個整數對應的進程狀態都不一樣。?
(1) 運行狀態(R - Running/TASK_RUNNING)
-
含義:進程正在CPU執行或就緒等待調度。
-
特點:
-
不一定是正在運行,可能在運行隊列中等待CPU時間片。
-
用戶態通過
top
/ps
看到的R
狀態包含實際運行和就緒兩種子狀態。
-
-
示例:
ps -aux
中狀態列顯示R
。
(2) 可中斷睡眠(S - Interruptible Sleep/TASK_INTERRUPTIBLE)
-
含義:進程等待某事件(如I/O完成、信號等),可被信號或事件喚醒。
-
特點:
-
常見的等待狀態,例如
read()
系統調用等待用戶輸入。 -
若收到信號(如
kill -SIGTERM
),進程可能提前退出睡眠。
-
-
示例:等待磁盤I/O的進程。
(3) 不可中斷睡眠(D - Uninterruptible Sleep/TASK_UNINTERRUPTIBLE)
-
含義:進程等待硬件條件(如磁盤I/O),不可被信號喚醒。
-
特點:
-
通常發生在內核態,短時間存在。長時間
D
狀態可能預示硬件故障。 -
kill -9
也無法終止此類進程,需重啟或解決底層問題。 -
D狀態(不可中斷睡眠)是Linux進程狀態之一,表示進程正在等待某些系統資源(通常是IO操作完成)而無法被中斷。當進程執行大量IO操作時,可能會頻繁進入D狀態(內存與磁盤)。
-
-
示例:NFS存儲故障時,進程可能卡在
D
狀態。
(4) 停止狀態(T - Stopped/TASK_STOPPED)
-
含義:進程被信號(如
SIGSTOP
、SIGTSTP
)暫停,等待恢復。 -
觸發方式:
-
SIGSTOP
(強制暫停)或SIGTSTP
(終端暫停,如Ctrl+Z
)。 -
通過
SIGCONT
(如kill -SIGCONT PID
)恢復運行。
-
-
示例:調試程序時手動暫停進程。
(5)跟蹤狀態(T - Tracing Stop)?
- ??含義??:進程被調試器(如
gdb
)跟蹤時暫停。 - ??特點??:
- 與普通
stopped
類似,但專用于調試場景。 - 調試器通過
ptrace
系統調用控制進程。
- 與普通
- ??常見場景??:單步調試、設置斷點時。
(6) 僵尸狀態(Z - Zombie/EXIT_ZOMBIE)
-
含義:進程已終止,但父進程未調用
wait()
回收其資源。
特點:
- 資源占用極低(僅保留PID和退出狀態信息)
- 大量僵尸進程可能導致系統PID耗盡
解決方案:
- 終止父進程(僵尸進程將由init進程自動回收)
- 修復父進程邏輯,確保正確處理子進程退出
僵尸狀態(Zombie)詳解:
- 當子進程退出后,若父進程未通過wait()系統調用讀取其退出狀態碼,就會產生僵尸進程
- 關鍵特征:
- 會保留終止狀態在進程表中
- 持續等待父進程讀取其退出狀態碼
- 產生條件:子進程已退出,但父進程仍在運行且未讀取子進程狀態
-
示例:父進程忽略子進程退出信號的程序。
(7) 死亡狀態(X - Dead/EXIT_DEAD)
-
含義:進程最終終止狀態,資源已完全釋放。
-
特點:瞬時狀態,用戶工具通常無法觀察到。
二、其他擴展狀態(動態視圖)
(1) t (TASK_TRACED,被跟蹤狀態)
-
含義:進程被調試器(如
gdb
)或跟蹤工具(如strace
)暫停。 -
示例:
gdb attach PID
后進程進入此狀態。
(2) I (IDLE,空閑狀態)
-
含義:內核線程的空閑狀態,部分工具可能顯示為
I
。
三、特殊狀態(非標準進程狀態)
-
跟蹤狀態(T - Tracing Stop):進程被調試器(如
strace
、gdb
)暫停,表現為T
。 -
深度睡眠(D+):不可中斷睡眠且為前臺進程(
+
表示前臺進程組)。