Linux進程的生命周期:狀態定義、轉換與特殊場景

前言

????????在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)

  • 含義:進程被信號(如SIGSTOPSIGTSTP)暫停,等待恢復。

  • 觸發方式:

    • 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)詳解:

  1. 當子進程退出后,若父進程未通過wait()系統調用讀取其退出狀態碼,就會產生僵尸進程
  2. 關鍵特征:
    • 會保留終止狀態在進程表中
    • 持續等待父進程讀取其退出狀態碼
  3. 產生條件:子進程已退出,但父進程仍在運行且未讀取子進程狀態
  • 示例:父進程忽略子進程退出信號的程序。

(7) 死亡狀態(X - Dead/EXIT_DEAD)

  • 含義:進程最終終止狀態,資源已完全釋放。

  • 特點:瞬時狀態,用戶工具通常無法觀察到。


二、其他擴展狀態(動態視圖)

(1) t (TASK_TRACED,被跟蹤狀態)

  • 含義:進程被調試器(如gdb)或跟蹤工具(如strace)暫停。

  • 示例:gdb attach PID后進程進入此狀態。

(2) I (IDLE,空閑狀態)

  • 含義:內核線程的空閑狀態,部分工具可能顯示為I


三、特殊狀態(非標準進程狀態)

  • 跟蹤狀態(T - Tracing Stop):進程被調試器(如stracegdb)暫停,表現為T

  • 深度睡眠(D+):不可中斷睡眠且為前臺進程(+表示前臺進程組)。

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

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

相關文章

神經網絡簡介

大腦的基本計算單位是神經元(neuron)。人類的神經系統中大約有860億個神經元,它們被大約10^14-10^15個突觸(synapses)連接起來。下面圖表的左邊展示了一個生物學的神經元,右邊展示了一個常用的數學模型。每…

多路由協議融合與網絡服務配置實驗(電視機實驗)

多路由協議融合與網絡服務配置實驗文檔 一、實驗用途和意義 (一)用途 本實驗模擬企業復雜網絡環境,整合 OSPF、RIPv2 動態路由協議,結合 DHCP、FTP、Telnet 服務配置及訪問控制策略,實現多區域網絡互聯、服務部署與…

在指定conda 環境里安裝 jupyter 和 python kernel的方法

在 Conda 的指定環境中安裝 Jupyter 和 Python Kernel 是一個常見操作,以下是詳細步驟,確保在指定環境中正確配置 Jupyter 和 Python Kernel: 1. 準備工作 確保已安裝 Anaconda 或 Miniconda,Conda 環境管理工具可用。確認已創建或計劃使用的 Conda 環境。2. 步驟:安裝 J…

【數據結構與算法】數據結構初階:詳解順序表和鏈表(四)——單鏈表(下)

🔥個人主頁:艾莉絲努力練劍 ?專欄傳送門:《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 🍉學習方向:C/C方向 ??人生格言:為天地立心,為生民立命,為…

Java+AI精準廣告革命:實時推送系統實戰指南

? 廣告推送的世紀難題 用戶反感&#xff1a;72%用戶因無關廣告卸載APP 轉化率低&#xff1a;傳統推送轉化率<0.5% 資源浪費&#xff1a;40%廣告預算被無效曝光消耗 &#x1f9e0; 智能廣告系統架構 &#x1f525; 核心模塊實現&#xff08;Java 17&#xff09; 1. 實時…

JVM組成及運行流程 - 面試筆記

JVM整體架構 JVM&#xff08;Java Virtual Machine&#xff09;是Java程序運行的核心環境&#xff0c;主要由以下幾個部分組成&#xff1a;1. 程序計數器&#xff08;Program Counter&#xff09; 特點&#xff1a;線程私有&#xff0c;每個線程都有獨立的程序計數器作用&#…

JavaEE——線程池

目錄前言1. 概念2. 線程池相關參數3. Executors的使用總結前言 線程是為了解決進程太重的問題&#xff0c;操作系統中進程的創建和銷毀需要較多的系統資源&#xff0c;用了輕量級的線程來代替部分線程&#xff0c;但是如果線程創建和銷毀的頻率也開始提升到了一定程度&#xf…

3 c++提高——STL常用容器(一)

目錄 1 string容器 1.1 string基本概念 1.2 string構造函數 1.3 string賦值操作 1.4 string字符串拼接 1.5 string查找和替換 1.6 string字符串比較 1.7 string字符存取 1.8 string插入和刪除 1.9 string子串 2 vector容器 2.1 vector基本概念 2.2 vector構造函數…

手把手教你用【Go】語言調用DeepSeek大模型

1、首先呢&#xff0c;點擊 “DeepSeek”” 這個&#xff0c; 可以充1塊玩玩。 2、然后獲取api-key 3、替換apiKey const (apiURL "https://api.deepseek.com/v1/chat/completions"apiKey "your api key" // 替換為你的實際 API KeymodelName &…

自動化UI測試工具TestComplete的核心功能及應用

對桌面應用穩定性與用戶體驗的挑戰&#xff0c;手動測試效率低、覆蓋有限&#xff0c;而普通自動化工具常難以應對復雜控件識別、腳本靈活性和大規模并行測試的需求。 自動化UI測試工具TestComplete憑借卓越的對象識別能力、靈活的測試創建方式以及高效的跨平臺并行執行功能&a…

【C/C++】邁出編譯第一步——預處理

【C/C】邁出編譯第一步——預處理 在C/C編譯流程中&#xff0c;預處理&#xff08;Preprocessing&#xff09;是第一個也是至關重要的階段。它負責對源代碼進行初步的文本替換與組織&#xff0c;使得編譯器在后續階段能正確地處理規范化的代碼。預處理過程不僅影響編譯效率&…

快捷鍵——VsCode

一鍵折疊所有的代碼塊 先按 ctrl K&#xff0c;再ctrl 0 快速注釋一行 ctrl /

import 和require的區別

概念 import 是es6 規范&#xff0c;主要應用于瀏覽器和主流前端框架當中&#xff0c;export 導出&#xff0c; require 是 commonjs 規范&#xff0c;主要應用于nodejs環境中&#xff0c;module.exports 導出編譯規則 import 靜態導入是編譯時解析&#xff0c;動態導入是執…

8、鴻蒙Harmony Next開發:相對布局 (RelativeContainer)

目錄 概述 基本概念 設置依賴關系 設置參考邊界 設置錨點 設置相對于錨點的對齊位置 子組件位置偏移 多種組件的對齊布局 組件尺寸 多個組件形成鏈 概述 RelativeContainer是一種采用相對布局的容器&#xff0c;支持容器內部的子元素設置相對位置關系&#xff0c;適…

Linux命令的命令歷史

Linux下history命令可以對當前系統中執行過的所有shell命令進行顯示。重復執行命令歷史中的某個命令&#xff0c;使用&#xff1a;!命令編號&#xff1b;環境變量histsize的值保存歷史命令記錄的總行數&#xff1b;可用echo查看一下&#xff1b;需要大寫&#xff1b;環境變量hi…

【C++小白逆襲】內存管理從崩潰到精通的秘籍

目錄【C小白逆襲】內存管理從崩潰到精通的秘籍前言&#xff1a;為什么內存管理讓我掉了N根頭發&#xff1f;內存四區大揭秘&#xff1a;你的變量都住在哪里&#xff1f;&#x1f3e0;內存就像大學宿舍區 &#x1f3d8;?C語言的內存管理&#xff1a;手動搬磚時代 &#x1f9f1;…

【網絡安全】利用 Cookie Sandwich 竊取 HttpOnly Cookie

未經許可,不得轉載。 文章目錄 引言Cookie 三明治原理解析Apache Tomcat 行為Python 框架行為竊取 HttpOnly 的 PHPSESSID Cookie第一步:識別 XSS 漏洞第二步:發現反射型 Cookie 參數第三步:通過 Cookie 降級實現信息泄露第四步:整合攻擊流程修復建議引言 本文將介紹一種…

【工具】什么軟件識別重復數字?

網上的數字統計工具雖多&#xff0c;但處理重復數字時總有點不盡如人意。 要么只能按指定格式輸入&#xff0c;要么重時得手動一點點篩&#xff0c;遇上數據量多的情況&#xff0c;光是找出重復的數字就得另外花不少功夫。? 于是我做了個重復數字統計器&#xff0c;不管是零…

CSS分層渲染與微前端2.0:解鎖前端性能優化的新維度

CSS分層渲染與微前端2.0&#xff1a;解鎖前端性能優化的新維度 當你的頁面加載時間超過3秒&#xff0c;用戶的跳出率可能飆升40%以上。這并非危言聳聽&#xff0c;而是殘酷的現實。在當前前端應用日益復雜、功能日益臃腫的“新常態”下&#xff0c;性能優化早已不是錦上添花的“…

AI Agent開發學習系列 - langchain之Chains的使用(5):Transformation

Transformation&#xff08;轉換鏈&#xff09;是 LangChain 中用于“自定義數據處理”的鏈式工具&#xff0c;允許你在鏈路中插入任意 Python 代碼&#xff0c;對輸入或中間結果進行靈活處理。常用于&#xff1a; 對輸入/輸出做格式化、過濾、摘要、拆分等自定義操作作為 LLMC…