当前位置: 首页 > news >正文

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.dtcms.com/a/276342.html

相关文章:

  • 【Elasticsearch】检索模板(Search Template)
  • 从输入到路径:AI赋能的地图语义解析与可视化探索之旅(2025空间智能全景)
  • C++ Boost 自动链接机制详解
  • Java基础:泛型
  • 单调栈单调队列【算法进阶】
  • 11. JVM中的分代回收
  • 数据结构自学Day6 栈与队列
  • BaseDao 通用查询方法设计与实现
  • 快速过一遍Python基础语法
  • 015---全面理解交易:区块链状态转移的原子单位与链上执行全流程图解
  • 【AI News | 20250711】每日AI进展
  • APP Inventor使用指南
  • LeetCode 3169.无需开会的工作日:排序+一次遍历——不需要正难则反,因为正着根本不难
  • 【使用Pyqt designer时pyside2安装失败】
  • 如何彻底禁用 Chrome 自动更新
  • C++实现二叉树左右子树交换算法
  • vuecil3+版本下,兼容ie等不支持es6的低版本浏览器
  • 内容总监的效率革命:用Premiere Pro AI,实现视频画幅“一键重构”
  • 四、深度学习——CNN
  • 快速上手UniApp(适用于有Vue3基础的)
  • 服务器ssh连接防护指南
  • 软件测试基础1-软件测试需求分析
  • Python技巧记录
  • 详细理解向量叉积
  • CVPR2025 Mamba系列
  • 内容总结I
  • 我的LeetCode刷题笔记——树(2)
  • 带货视频评论洞察 Baseline 学习笔记 (Datawhale Al夏令营)
  • [动态规划]1900. 最佳运动员的比拼回合
  • Matplotlib 模块入门