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

Linux 进程状态:内核角度与应用层角度

Linux 进程状态:内核角度与应用层角度

目标:系统梳理 Linux 进程状态的内核定义、取值语义与应用层展示的关系;明确 ps/top/proc 的映射;说明常见状态转移与调试要点。

代码树:kernel-4.4.94


1. 内核角度:状态位与字符映射

  • 概念:
    • task->state 表示“可运行性”相关状态位;task->exit_state 表示退出相关位。二者分离,避免误修改。
  • 关键宏(include/linux/sched.h):
    • 基本位:TASK_RUNNING(0)TASK_INTERRUPTIBLE(1)TASK_UNINTERRUPTIBLE(2)__TASK_STOPPED(4)__TASK_TRACED(8)
    • 退出位:EXIT_DEAD(16)EXIT_ZOMBIE(32)EXIT_TRACE(EXIT_ZOMBIE|EXIT_DEAD)
    • 扩展位:TASK_DEAD(64)TASK_WAKEKILL(128)TASK_WAKING(256)TASK_PARKED(512)TASK_NOLOAD(1024),最大 TASK_STATE_MAX(2048)
    • 组合便捷宏:
      • TASK_KILLABLE = TASK_WAKEKILL | TASK_UNINTERRUPTIBLE
      • TASK_STOPPED = TASK_WAKEKILL | __TASK_STOPPED
      • TASK_TRACED = TASK_WAKEKILL | __TASK_TRACED
      • TASK_IDLE = TASK_UNINTERRUPTIBLE | TASK_NOLOAD
      • TASK_NORMAL = TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE
      • TASK_ALL = TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED
    • 报告集:TASK_REPORT = TASK_RUNNING | TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE | __TASK_STOPPED | __TASK_TRACED | EXIT_ZOMBIE | EXIT_DEAD
  • 字符映射(TASK_STATE_TO_CHAR_STR):"RSDTtXZxKWPN"
    • R: running
    • S: sleeping(可中断睡眠)
    • D: disk sleep(不可中断睡眠,通常是 I/O 等待)
    • T: stopped
    • t: tracing stop
    • X: dead
    • Z: zombie
    • x/K/W/P/N:扩展/内部使用字符位,供调试/trace 映射(不同子系统可能裁剪显示)。
  • /proc 映射(fs/proc/array.c:get_task_state()):
    • TASK_REPORT 为掩码,将 state|exit_state 映射到字符串数组:
      • "R (running)""S (sleeping)""D (disk sleep)""T (stopped)""t (tracing stop)""X (dead)""Z (zombie)"
    • TASK_PARKED 单独处理:视为 TASK_INTERRUPTIBLE(睡眠),避免误报为 running。

2. 应用层角度:ps/top/proc 的展示

  • ps -o state / top 的状态字符一般对应 TASK_STATE_TO_CHAR_STR 的前七类(R/S/D/T/t/X/Z)。
  • /proc/<pid>/statusState: 行来自 get_task_state(),显示为完整字符串(如 S (sleeping))。
  • tools/perf 中的状态字符串可能有独立定义(例如 builtin-sched.c 中的 TASK_STATE_TO_CHAR_STR),但语义与内核一致。

3. 常见状态语义与转移

  • R(running):
    • 任务在 CPU 上运行或可运行队列上等待调度;state == 0
  • S(sleeping,可中断):
    • 正在等待事件(如信号/条件);可被信号唤醒;TASK_INTERRUPTIBLE
  • D(disk sleep,不可中断):
    • 常见于设备 I/O 等不可中断等待;不会响应信号;TASK_UNINTERRUPTIBLE
  • T(stopped):
    • SIGSTOP/SIGTSTP 等信号停止或处于 ptrace 停止;__TASK_STOPPED
  • t(tracing stop):
    • ptrace 等导致的跟踪停止;__TASK_TRACED
  • Z(zombie):
    • 任务已退出但父进程尚未 wait 回收;EXIT_ZOMBIE/proc/<pid> 仍存在。
  • X(dead):
    • 将被彻底回收;EXIT_DEAD;通常用户态看不到。
  • 其他内部位:
    • TASK_WAKING(即将被唤醒)、TASK_PARKED(kthread park)、TASK_NOLOAD(不计入 load)等用于调度器与内核态控制。

状态转移示例:

  • R → S:schedule()wait_event() 等进入可中断睡眠;
  • S/D → R:事件达成或 wake_up_process() 唤醒;
  • R/S/D → T/t:收到停止/跟踪信号或进入 ptrace 停止;
  • 任意 → Z:调用 do_exit(),执行退出流程,等待父回收;
  • Z → 移除:父进程 wait*() 系列回收后,内核清理任务结构。

4. 调试与排查建议

  • 长期处于 D(不可中断):
    • 可能设备驱动/块层卡住;查看栈回溯(echo t > /proc/sysrq-triggerecho w > /proc/sysrq-trigger)与 sched_debug,定位持锁点或 I/O;结合 ftraceblock 事件与 perf trace
  • 僵尸进程(Z)清理:
    • 确认父进程是否正确 wait;若父丢失,init 会接管并回收;检查父进程的 SIGCHLD 处理。
  • 频繁切换 R/S:
    • 正常活跃任务;若有抖动或负载异常,检查 CFS 参数与抢占阈值(sched_wakeup_granularity)以及锁竞争。
  • kthread parked:
    • 属于内核线程管理行为,通常正常;TASK_PARKED/proc 中映射为 S。

5. 源码索引(4.4.94)

  • 状态宏与字符:include/linux/sched.hTASK_*TASK_STATE_TO_CHAR_STR)。
  • /proc 映射:fs/proc/array.c:get_task_state()
  • 调度器使用:kernel/sched/core.cstate_to_char 引用、状态统计)。
  • trace 输出:kernel/trace/trace_output.cstate_to_char[])。
  • perf 工具:tools/perf/builtin-sched.c 的状态表。

6. 小结

  • 内核将进程状态设计为位图集,以便组合表达可运行性与退出等不同维度;应用层以字符或字符串方式展示主要状态。
  • 正确理解 S/D/T/t/Z 的语义与转移,有助于定位性能瓶颈(I/O 卡顿、锁竞争)、功能问题(僵尸进程、停止/跟踪状态)与调度行为。

7. 状态转换图(更清晰的可视描述)

说明:以下为 Mermaid 状态图。

7.1 总览转换图

do_exit()
do_exit()
父进程 wait* 回收
新任务入队并被调度
schedule/wait_event 等可中断等待
wake_up_process/事件达成
不可中断等待(IO 等)
I/O 完成/唤醒
SIGSTOP/SIGTSTP
SIGCONT
ptrace 停止
ptrace continue
do_exit()
Running
被选中运行
抢占/调度切换
Runnable
OnCPU
Sleeping
DiskSleep
Stopped
TracingStop
Zombie

图例:

  • Running=R、Sleeping=S、DiskSleep=D、Stopped=T、TracingStop=t、Zombie=Z。

7.2 I/O 阻塞典型路径

进入不可中断等待(设备/块层)
I/O 完成 → 唤醒 → 重新入队
Running
DiskSleep
常见在驱动/块层路径
不可响应该阶段的信号

7.3 跟踪/停止场景

收到 SIGSTOP/SIGTSTP
SIGCONT
被 ptrace 停止
继续执行 (ptrace)
Running
Stopped
TracingStop
调试器控制执行流程

7.4 生命周期(与父进程交互)

fork (子 R)
exec(更换映像, 仍为 R/S/D 间转换)
do_exit()
wait*/回收子(Z→移除)
父进程
子进程
Zombie
http://www.dtcms.com/a/573361.html

相关文章:

  • A与非A、综合分析技巧
  • java之jvm堆内存占用问题
  • 江门网站制作设计网站地址栏图标文字
  • 做游戏网站多少钱网站做好了怎么上线
  • taro UI 的icon和自定义iconfont的icon冲突
  • 【开发】Git处理分支的指令
  • Linux 进程的写时拷贝(Copy-On-Write, COW)详解
  • git将克隆的目录作为普通文件夹上传
  • 集群网络技术1:RDMA和相关协议
  • SesameOp 恶意软件滥用 OpenAI Assistants API 实现与 C2 服务器的隐蔽通信
  • 网站开发服务器怎么选wordpress文章404
  • 安装 awscli
  • AWS + 发财CMS:高效采集站的新形态
  • 360提交网站wordpress购物商城代码
  • 在 DGX Spark 上使用 Ollama 打开 WebUI
  • 中小型网站服务器搭建方案西安做网站公司
  • Linux 常用命令详解与使用规则
  • ELK日志分析组件介绍+部署详解
  • 谢岗网站仿做肥东建设网站
  • 张永伟营销:中国市场GEO发展趋势专业报告:SEO与AI搜索优化视角
  • Ubuntu 服务器的无法使用WinSCP低版本连接登录
  • Ubuntu24.04 不能使用todesk 解决办法
  • 【LeetCode】100. 相同的树
  • 51单片机数码管显示函数分享(8051汇编)
  • 国外互联网科技网站微信引流用什么软件好用
  • 静态交叉编译rust程序
  • 1.2.STM32简介——全程手敲板书
  • 2.2.6【2020统考真题】
  • Doris 并入CMP7(类Cloudera CDP 7.3.1 404华为鲲鹏ARM版)的方案和实施源代码
  • Vue3项目实战:从0到1开发企业级中后台系统(3):架构核心!手把手封装Axios、Pinia、Router