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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…