Linux内核分析之进程管理-06
第6章 进程状态与转换
基于 Linux 6.12.38 源码分析
6.1 进程状态定义
6.1.1 状态列表
位置: include/linux/sched.h:99
1 | /* Used in tsk->__state: */ |
6.1.2 状态详解
TASK_RUNNING (0)
- 任务就绪或正在运行
- 在就绪队列中等待 CPU
- 或正在 CPU 上执行
TASK_INTERRUPTIBLE (1)
- 可中断睡眠状态
- 等待某些条件满足
- 可被信号唤醒
TASK_UNINTERRUPTIBLE (2)
- 不可中断睡眠状态
- 等待某些条件满足
- 不能被信号唤醒
__TASK_STOPPED (4)
- 任务被停止
- 收到 SIGSTOP/SIGTSTP 信号
__TASK_TRACED (8)
- 被 ptrace 跟踪
- 调试器控制
EXIT_ZOMBIE (32)
- 僵尸状态
- 进程已退出,但父进程尚未 wait
EXIT_DEAD (16)
- 进程最终状态
- 即将被回收
6.2 状态转换图
6.2.1 完整状态机
1 | fork() / clone() |
6.2.2 状态设置函数
1 | // include/linux/sched.h |
6.3 睡眠与唤醒
6.3.1 睡眠函数
1 | // include/linux/sched.h |
6.3.2 唤醒函数
1 | // include/linux/wait.h |
6.3.3 try_to_wake_up()
位置: kernel/sched/core.c
1 | /* |
6.4 等待队列
6.4.1 数据结构
位置: include/linux/wait.h
1 | /* |
6.4.2 等待队列操作
1 | /* |
6.4.3 使用示例
1 | // 等待队列和条件 |
6.5 特殊状态
6.5.1 TASK_STOPPED
进程收到 SIGSTOP、SIGTSTP、SIGTTIN 或 SIGTTOU 信号时进入此状态:
1 | static int do_signal_stop(int signr) |
6.5.2 TASK_TRACED
进程被 ptrace 跟踪时的状态:
1 | // 被 ptrace 时设置此状态 |
6.5.3 TASK_KILLABLE
组合状态,类似于不可中断睡眠但可被致命信号唤醒:
1 |
|
6.6 状态检查工具
6.6.1 /proc/[pid]/status
1 | $ cat /proc/1234/status |
状态码对应:
- R (Running)
- S (Sleeping)
- D (Disk sleep /不可中断睡眠)
- T (Stopped / 被跟踪)
- Z (Zombie)
6.6.2 ps 命令
1 | # 查看所有进程状态 |
6.7 本章小结
本章介绍了 Linux 进程状态与转换机制:
- 进程状态定义:TASK_RUNNING、TASK_INTERRUPTIBLE、TASK_UNINTERRUPTIBLE 等
- 状态转换图:从创建到退出的完整状态机
- 睡眠机制:wait_event 系列宏的使用
- 唤醒机制:wake_up 和 try_to_wake_up
- 等待队列:等待队列头和队列项的操作
- 特殊状态:TASK_STOPPED、TASK_TRACED、TASK_KILLABLE
- 状态查看:/proc 和 ps 工具
下一章将介绍进程退出与等待机制。
- Title: Linux内核分析之进程管理-06
- Author: 韩乔落
- Created at : 2026-01-14 19:20:11
- Updated at : 2026-01-19 13:40:19
- Link: https://jelasin.github.io/2026/01/14/Linux内核分析之进程管理-06/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments