当前位置: 首页 > 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.lryc.cn/news/585909.html

相关文章:

  • 杭州乐湾科技有限公司的背景、产品体系与技术能力的全方位深度分析
  • linux_线程概念
  • 车载操作系统 --- Linux实时化与硬实时RTOS综述
  • windows电脑远程win系统服务器上的wsl2
  • 部署Harbor私有仓库
  • 服务器怎么跑Python项目?
  • vite如何生成gzip,并在服务器上如何设置开启
  • 自动化证书续签工具针对VPS服务器HTTPS服务的维护实践
  • Python技巧记录
  • 浅谈npm,cnpm,pnpm,npx,nvm,yarn之间的区别
  • 【云端深度学习训练与部署平台】AutoDL连接VSCode运行深度学习项目的全流程
  • Go语言中的Options模式
  • Mac M芯片安装RocketMQ服务
  • tp8.0\jwt接口安全验证
  • 深入解析 LinkedList
  • 在 Android 库模块(AAR)中,BuildConfig 默认不会自动生成 VERSION_CODE 和 VERSION_NAME 字段
  • 手机识别数据集,2628张原始图片,支持yolo,coco json,pasical voc xml等格式的标注
  • 搭建云手机教程
  • 深大计算机游戏开发实验三
  • Apache HTTP Server 从安装到配置
  • 实习内容总结
  • javaEE——synchronized关键字
  • docker 443错误 lookup docker.mirrors.ustc.edu.cn: no such host
  • Vue Vue-route (5)
  • 【C#】GraphicsPath的用法
  • Vscode中使用C++代码进行debug
  • 阿里云服务器安装JDK21
  • WildCard野卡已跑路(包含gpt plus升级方案)
  • 2025.7.12总结
  • Python-类-面向对象-继承-多继承-学习笔记