内核编程十三:进程状态详解

进程如同数字世界中的生命体,诞生时被系统母体赋予初始资源,在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.mzph.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; 类加载阶段 // 手动加载…