task-struct

Linux 内核中的 task_struct 结构详解

task_struct 是 Linux 内核中用来表示 进程(或者线程) 的核心结构体,是操作系统调度、管理和追踪进程的基础。该结构体非常庞大,包含了大量字段,用于管理进程的各种状态。


🧠 task_struct 的主要组成结构(按功能分类)

1. 进程标识

用于标识进程的唯一性:

1
2
3
pid_t pid;                      // 进程ID
pid_t tgid; // 线程组ID(主线程的pid)
struct pid *thread_pid; // 线程ID(每个线程唯一)

2. 进程状态与调度相关

包括进程状态、优先级、调度器策略等:

1
2
3
4
5
6
volatile long state;           // 当前进程状态(如 TASK_RUNNING 等)
unsigned int flags; // 标志位(PF_开头)
int prio; // 动态优先级
int static_prio; // 静态优先级
int policy; // 调度策略(如 SCHED_NORMAL)
struct sched_entity se; // CFS调度实体

3. 父子进程关系

记录进程之间的层级关系:

1
2
3
4
struct task_struct *real_parent;   // 创建它的进程
struct task_struct *parent; // 当前父进程
struct list_head children; // 子进程链表
struct list_head sibling; // 兄弟进程链表

4. 内存管理

与地址空间和虚拟内存相关的信息:

1
2
struct mm_struct *mm;             // 进程的内存描述符(用户态)
struct mm_struct *active_mm; // 当前活跃的 mm(内核线程也会设置)

5. 文件系统与文件描述符表

1
2
struct fs_struct *fs;             // 文件系统信息(当前目录等)
struct files_struct *files; // 打开的文件描述符表

6. 信号处理

1
2
3
struct signal_struct *signal;     // 所属线程组的信号处理结构
struct sighand_struct *sighand; // 信号处理函数
sigset_t blocked; // 当前屏蔽的信号

7. 命名空间(Namespace)

1
struct nsproxy *nsproxy;          // 各类命名空间的统一接口

8. CPU 和上下文切换相关

1
2
3
struct thread_struct thread;      // 存储CPU寄存器等上下文信息
int on_cpu; // 是否在CPU上运行
struct cpumask *cpus_allowed; // 允许运行在哪些CPU上

9. 时间统计

1
2
u64 utime;                        // 用户态运行时间
u64 stime; // 内核态运行时间

10. Cgroup 与资源限制

1
struct css_set *cgroups;          // 所属的 cgroup 集合

11. 调试与追踪

1
unsigned long ptrace;             // 是否被 ptrace 追踪

12. 内核同步与锁

1
spinlock_t alloc_lock;            // 用于保护任务结构中的关键区域

13. 其他常用字段

1
2
3
char comm[TASK_COMM_LEN];         // 进程名(最多16字节)
struct task_struct *group_leader; // 线程组的 leader
int exit_code; // 退出代码

🔧 小结图解(简略)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
task_struct
├── 进程标识:pid, tgid
├── 状态与调度:state, prio, policy, se
├── 父子关系:parent, children
├── 内存管理:mm, active_mm
├── 文件系统:files, fs
├── 信号处理:signal, sighand
├── 命名空间:nsproxy
├── CPU调度:thread, on_cpu
├── 时间统计:utime, stime
├── Cgroup:cgroups
├── 同步锁:alloc_lock
├── 调试追踪:ptrace
└── 通用信息:comm, exit_code

该结构体可能会在不同版本的内核中有所变动,但整体结构和这些功能模块是核心。


task-struct
http://gadoid.io/2025/04/01/task-struct/
作者
Codfish
发布于
2025年4月1日
许可协议