內核編程十三:進程狀態詳解

進程如同數字世界中的生命體,誕生時被系統母體賦予初始資源,在CPU的脈搏中呼吸,于內存的疆域里生長。它睜開線程之眼觀察世界,伸出系統調用之手與環境互動,時而如幼童般單純執行指令,時而如哲人般陷入阻塞沉思。當時間片如春雨灑落便舒展枝椏,遭遇死鎖風暴則蜷縮休眠。最終在exit的凋零中歸還所有記憶,化作進程列表里一道轉瞬即逝的微光,完成從二進制胚胎到硅基消亡的完整輪回。

內核定義的進程狀態

在 include/linux/sched.h 文件中對進程的狀態進行了具體的定義,如下所示:

/* Used in tsk->state: */
#define TASK_RUNNING			0x0000
#define TASK_INTERRUPTIBLE		0x0001
#define TASK_UNINTERRUPTIBLE		0x0002
#define __TASK_STOPPED			0x0004
#define __TASK_TRACED			0x0008
/* Used in tsk->exit_state: */
#define EXIT_DEAD			0x0010
#define EXIT_ZOMBIE			0x0020
#define EXIT_TRACE			(EXIT_ZOMBIE | EXIT_DEAD)
/* Used in tsk->state again: */
#define TASK_PARKED			0x0040
#define TASK_DEAD			0x0080
#define TASK_WAKEKILL			0x0100
#define TASK_WAKING			0x0200
#define TASK_NOLOAD			0x0400
#define TASK_NEW			0x0800
/* RT specific auxilliary flag to mark RT lock waiters */
#define TASK_RTLOCK_WAIT		0x1000
#define TASK_STATE_MAX			0x2000

這些狀態可以分為以下三類 :

1. 運行與睡眠狀態

狀態值(十六進制)描述
TASK_RUNNING0x0000進程正在運行(CPU 執行)或就緒(在運行隊列中等待調度)。
TASK_INTERRUPTIBLE0x0001可中斷睡眠:進程因等待資源(如 I/O、信號量)被阻塞,但可被信號或事件喚醒。
TASK_UNINTERRUPTIBLE0x0002不可中斷睡眠:進程因關鍵操作(如磁盤 I/O)被阻塞,不可被信號喚醒。需謹慎使用。
__TASK_STOPPED0x0004進程被信號(如?SIGSTOPSIGTSTP)暫停,直到收到?SIGCONT?恢復。
__TASK_TRACED0x0008進程被調試器(如?ptrace)跟蹤,通常與?STOPPED?聯合出現。
TASK_PARKED0x0040進程主動休眠(如內核線程),需通過特定喚醒機制恢復。
TASK_DEAD0x0080進程正在結束,資源尚未完全釋放(與?EXIT_DEAD?配合使用)。
TASK_WAKEKILL0x0100附加標志:允許致命信號(如?SIGKILL)喚醒處于?INTERRUPTIBLE/UNINTERRUPTIBLE?的進程。
TASK_WAKING0x0200臨時狀態:進程正在從睡眠狀態轉移到運行隊列。

狀態轉換

  • 運行 → 睡眠:因等待資源(如?TASK_INTERRUPTIBLE)或主動暫停(如?__TASK_STOPPED)。

  • 睡眠 → 運行:被事件喚醒(如 I/O 完成)或收到信號(如?SIGCONT)。

不可中斷睡眠(UNINTERRUPTIBLE)

常見于磁盤 I/O 或內核關鍵路徑,無法通過?kill?終止,需解決底層阻塞問題。

調試相關狀態

__TASK_TRACED?和?__TASK_STOPPED?用于調試器(如?gdb)或 shell 作業控制(如?jobs)。


2. 退出狀態

狀態值(十六進制)描述
EXIT_ZOMBIE0x0020僵尸進程:進程已終止,但父進程尚未通過?wait()?回收其資源(如 PID、退出狀態)。
EXIT_DEAD0x0010徹底退出:進程資源已完全釋放,是退出過程的最終狀態。
EXIT_TRACE0x0030被調試進程的退出狀態(`ZOMBIEDEAD`)。

退出流程:進程終止后先變為?EXIT_ZOMBIE,父進程回收后轉為?EXIT_DEAD

僵尸進程:若父進程未調用?wait(),子進程會長期保持?EXIT_ZOMBIE,占用內核資源。


3. 其他輔助狀態

狀態描述
TASK_NOLOAD進程不參與系統負載計算(如某些內核線程)。
TASK_NEW進程剛創建,尚未完全初始化。
TASK_RTLOCK_WAIT進程正在等待實時(RT)互斥鎖(用于實時調度策略)。

結構體中狀態的定義

struct task_struct?中的?unsigned int __state?成員是用來標記進程狀態的核心字段,它存儲了進程的當前狀態標志(如?TASK_RUNNINGTASK_INTERRUPTIBLE?等)

struct task_struct {
...
unsigned int			__state;
...
}

打印進程狀態(內核態)

通過 current 宏打印當前進程的狀態,再通過dmesg進行查看

struct task_struct *current_task = current;
printk(KERN_INFO "Current process state: %d\n", current_task->__state);

用戶態進程狀態

ps?通過解析?/proc/<pid>/status?或?/proc/<pid>/stat?獲取進程的狀態,顯示為單字母縮寫,僅反映內核狀態的子集:

ps?狀態含義對應的內核狀態
RRunning (運行/就緒)TASK_RUNNING
SInterruptible SleepTASK_INTERRUPTIBLE(可中斷睡眠)
DUninterruptible SleepTASK_UNINTERRUPTIBLE(不可中斷睡眠,通常因等待磁盤 I/O 或內核鎖)
ZZombieEXIT_ZOMBIE
TStopped__TASK_STOPPED(如通過?SIGSTOP?暫停)
tTracing stop__TASK_TRACED(被調試器跟蹤,如?gdb
XDead (已退出)EXIT_DEAD(極少在?ps?中看到,因進程已完全退出)
IIdle (空閑線程)內核線程的特殊狀態(無直接對應標志,可能結合?TASK_RUNNING?和?TASK_NOLOAD
P?/?WParked / WakingTASK_PARKED?或?TASK_WAKING(某些內核版本支持)

內核態 VS 用戶態

維度內核狀態ps?狀態
表示方式位掩碼(多狀態組合)單字母縮寫(互斥狀態)
粒度細粒度(支持復合狀態)粗粒度(簡化映射)
退出狀態明確區分?EXIT_ZOMBIE?和?EXIT_DEAD僅顯示?Z(僵尸)或?X(徹底退出極少見)
調試狀態單獨標記?__TASK_TRACED顯示為?t(與?T?區分)
實時狀態支持?TASK_RTLOCK_WAIT?等擴展標志無直接對應
用戶友好性面向內核開發者面向系統管理員/開發者
  • 內核狀態:豐富、細粒度,用于調度和資源管理。

  • ps?狀態:簡化、用戶友好,覆蓋常見場景。

  • 關鍵區別ps?隱藏了復合狀態和部分擴展標志(如?TASK_WAKING),但足以滿足日常監控需求。

示例分析

場景 1:進程因磁盤 I/O 阻塞
  • 內核狀態
    __state = TASK_UNINTERRUPTIBLE | TASK_NOLOAD
    (不可中斷睡眠 + 不計入負載)

  • ps?顯示
    D(僅體現不可中斷睡眠)

場景 2:被調試的暫停進程
  • 內核狀態
    __state = __TASK_STOPPED | __TASK_TRACED

  • ps?顯示
    t(優先顯示?TRACED,而非?T

場景 3:僵尸進程
  • 內核狀態
    exit_state = EXIT_ZOMBIE,?__state = TASK_DEAD

  • ps?顯示
    Z

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75490.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75490.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75490.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GitLab 中文版17.10正式發布,27項重點功能解讀【一】

GitLab 是一個全球知名的一體化 DevOps 平臺&#xff0c;很多人都通過私有化部署 GitLab 來進行源代碼托管。極狐GitLab 是 GitLab 在中國的發行版&#xff0c;專門為中國程序員服務。可以一鍵式部署極狐GitLab。 學習極狐GitLab 的相關資料&#xff1a; 極狐GitLab 官網極狐…

哈爾濱工業大學DeepSeek公開課人工智能:大模型原理 技術與應用-從GPT到DeepSeek|附視頻下載方法

導 讀INTRODUCTION 今天繼續哈爾濱工業大學車萬翔教授帶來了一場主題為“DeepSeek 技術前沿與應用”的報告。 本報告深入探討了大語言模型在自然語言處理&#xff08;NLP&#xff09;領域的核心地位及其發展歷程&#xff0c;從基礎概念出發&#xff0c;延伸至語言模型在機器翻…

web爬蟲筆記:js逆向案例十一 某數cookie(補環境流程)

web爬蟲筆記:js逆向案例十一 某數cookie(補環境流程) 一、獲取網頁數據請求流程 二、目標網址、cookie生成(逐步分析) 1、目標網址:aHR0cHM6Ly9zdWdoLnN6dS5lZHUuY24vSHRtbC9OZXdzL0NvbHVtbnMvNy9JbmRleC5odG1s 2、快速定位入口方法 1、通過腳本監聽、hook_cookie等操作可…

WPF ControlTemplate和DataTemplate

在 WPF 中&#xff0c;ControlTemplate 和 DataTemplate 是兩個非常重要的概念&#xff0c;它們分別用于定義控件的外觀和數據對象的顯示方式。以下是關于它們的詳細講解&#xff0c;包括定義、作用、使用場景以及實現示例。 1. ControlTemplate 1.1 定義 ControlTemplate 定…

Qt窗口控件之浮動窗口QDockWidget

浮動窗口QDockWidget QDockWidget 用于表示 Qt 中的浮動窗口&#xff0c;浮動窗口與工具欄類似&#xff0c;可以停靠在主窗口的上下左右位置&#xff0c;也可以單獨拖出來作浮動窗口。 1. QDockWidget方法 方法說明setWidget(QWiget*)用于使浮動窗口能夠被添加控件。setAllo…

游戲引擎學習第180天

我們將在某個時候替換C標準庫函數 今天我們要進行的工作是替換C標準庫函數&#xff0c;這是因為目前我們仍然在使用C語言開發&#xff0c;并且在某些情況下會調用C標準庫函數&#xff0c;例如一些數學函數和字符串格式化函數&#xff0c;尤其是在調試系統中&#xff0c;我們使…

深度學習PyTorch之動態計算圖可視化 - 使用 torchviz 生成計算圖

序號系列文章1深度學習訓練中GPU內存管理2深度學習PyTorch之數據加載DataLoader3深度學習 PyTorch 中 18 種數據增強策略與實現4深度學習pytorch之簡單方法自定義9類卷積即插即用5深度學習PyTorch之13種模型精度評估公式及調用方法6深度學習pytorch之4種歸一化方法&#xff08;…

K8S學習之基礎四十五:k8s中部署elasticsearch

k8s中部署elasticsearch 安裝并啟動nfs服務yum install nfs-utils -y systemctl start nfs systemctl enable nfs.service mkdir /data/v1 -p echo /data/v1 *(rw,no_root_squash) >> /etc/exports exports -arv systemctl restart nfs創建運行nfs-provisioner需要的sa賬…

Go紅隊開發—CLI框架(一)

CLI開發框架 命令行工具開發&#xff0c;主要是介紹開發用到的包&#xff0c;集成了一個框架&#xff0c;只要學會了基本每個人都能開發安全工具了。 該文章先學flags包&#xff0c;是比較經典的一個包&#xff0c;相比后面要學習的集成框架這個比較自由比較細化點&#xff0…

eclipse [jvm memory monitor] SHOW_MEMORY_MONITOR=true

eclipse虛擬機內存監控設置SHOW_MEMORY_MONITORtrue D:\eclipse-jee-oxygen-2-win32-x86_64\workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings org.eclipse.ui.prefs (文件比較多&#xff0c;別找錯了&#xff09; SHOW_MEMORY_MONITORtrue 重啟 -xms 1024…

量子計算與人工智能的融合:下一代算力革命

1. 引言&#xff1a;算力需求的飛速增長與量子計算的潛力 在信息技術飛速發展的今天&#xff0c;人工智能&#xff08;AI&#xff09;已經滲透到我們生活的方方面面&#xff0c;從智能助手到自動駕駛&#xff0c;再到醫療診斷&#xff0c;AI 的應用場景日益廣泛。然而&#xf…

Linux paste命令

目錄 一. 簡介二. 基本語法三. 小案例 一. 簡介 paste 命令用于合并多個文件的行&#xff0c;按列方式輸出&#xff0c;默認以制表符&#xff08;Tab&#xff09;分隔。 ?基本語法 paste [選項] 文件1 文件2 ...二. 基本語法 <()的方式模擬文件流paste命令將2個文件流粘…

uniapp處理流式請求

在uniapp里面處理流式請求相對于web端來說有點麻煩&#xff0c;下面我將講述幾種處理流式請求的方式。 1.websocket WebSocket 是處理實時數據流的最佳選擇之一&#xff0c;UniApp 提供了原生的 WebSocket 支持&#xff1a; <template><view class"container&…

低代碼理解

一、低代碼開發的核心定義 低代碼開發是通過可視化界面和聲明式編程替代傳統手工編碼的軟件開發范式&#xff0c;其核心目標是&#xff1a; 降低技術門檻&#xff1a;允許非專業開發者&#xff08;公民開發者&#xff09;參與應用構建提升開發效率&#xff1a;通過復用預制組…

WHAM 人體3d重建部署筆記 vitpose

目錄 視頻結果: docker安裝說明: conda環境安裝說明: 依賴項: 依賴庫: 安裝 mmpose,mmcv 下載模型權重: 算法原理, demo腳本 報錯inference_top_down_pose_model: 測試命令: 視頻結果: wham_smpl預測結果 git地址: GitHub - yohanshin/WHAM WHAM: Recons…

react 大屏根據屏幕分辨率縮放

記錄&#xff0c;以防忘記 const DataLargeScreen () > {const layoutRef useRef<any>();// ui稿寬度const width useRef(1920).current;// ui稿高度const height useRef(1080).current;const [scaleValue, setScaleValue] useState(1);const useWhichScaleValu…

【網絡】網關

【網絡】網關 網關 是計算機網絡中用于連接兩個不同網絡的設備或服務器&#xff0c;它充當著“翻譯器”和“轉發器”的角色&#xff0c;將數據包從一個網絡傳遞到另一個網絡&#xff0c;并在必要時進行協議轉換和數據重包裝。 主要功能 數據轉發&#xff1a;當本地網絡設備發…

Axure大屏可視化模板:賦能多領域,開啟數據展示新篇章

在當今這個數據爆炸的時代&#xff0c;數據已經成為各行各業的核心資產。然而&#xff0c;如何高效、直觀地展示數據&#xff0c;并將其轉化為有價值的決策依據&#xff0c;成為了許多企業和組織面臨的共同挑戰。Axure大屏可視化模板&#xff0c;作為一款強大的數據展示工具&am…

數據不外傳!通過內網穿透實現綠聯NAS遠程訪問的安全配置方案

文章目錄 前言1. 開啟ssh服務2. ssh連接3. 安裝cpolar內網穿透4. 配置綠聯NAS公網地址 前言 大家好&#xff0c;今天要帶給大家一個超級酷炫的技能——如何讓綠聯NAS秒變‘千里眼’&#xff0c;通過簡單的幾步操作就能輕松實現內網穿透。想象一下&#xff0c;無論你身處何地&a…

面試題精選《劍指Offer》:JVM類加載機制與Spring設計哲學深度剖析-大廠必考

一、JVM類加載核心機制 &#x1f525; 問題5&#xff1a;類從編譯到執行的全鏈路過程 完整生命周期流程圖 關鍵技術拆解 編譯階段 查看字節碼指令&#xff1a;javap -v Robot.class 常量池結構解析&#xff08;CONSTANT_Class_info等&#xff09; 類加載階段 // 手動加載…