Linux 进程管理(Process)
下面是一份 “内核级视角”的 Linux 进程管理(Process)核心子系统详解,不是 ps/top 用法,而是从内核数据结构、调度、状态、上下文切换到容器/NUMA 的完整认知框架。
适用 RHEL / AlmaLinux / Debian / Ubuntu / 云 / 容器 / 数据库 / 虚拟化。
Linux 没有 “线程” 这种内核对象,只有 task(任务)。
struct task_struct {
pid_t pid;
long state;
struct mm_struct *mm;
struct files_struct *files;
struct signal_struct *signal;
struct sched_entity se;
struct cgroup_subsys_state *css;
...
}
📌 进程 / 线程 = task_struct 的不同组合
| 概念 | 内核视角 |
|---|---|
| 进程 | 有独立 mm |
| 线程 | 共享 mm |
| 协程 | 用户态调度 |
| 项目 | 进程 | 线程 |
|---|---|---|
| PID | 不同 | 不同 |
| 虚拟地址空间 | 独立 | 共享 |
| 文件描述符 | 独立 | 共享 |
| 调度单位 | task | task |
📌 Linux 的线程 = 轻量级进程
fork()
- 复制 task_struct
- Copy-On-Write
clone()
- 指定共享资源
- 创建线程、容器的基础
clone(CLONE_VM | CLONE_FS | CLONE_FILES);
fork -> execve -> 新程序
- 替换用户态代码
- 内核态 task_struct 不变
exit -> ZOMBIE -> reaped
TASK_RUNNING
TASK_INTERRUPTIBLE
TASK_UNINTERRUPTIBLE (D)
TASK_STOPPED
TASK_ZOMBIE
D 状态(最可怕)
- 等待 IO,不能被 kill
📌 数据库、存储、NFS 常见
核心思想:
按虚拟运行时间公平分配 CPU
vruntime = 实际运行时间 / 权重
- 每 CPU 一个 rq
- 红黑树维护 task
| 类别 | 场景 |
|---|---|
| CFS | 普通进程 |
| RT | 实时任务 |
| Deadline | 确定性延迟 |
切换内容:
- CPU 寄存器
- 内存页表(CR3)
- 调度实体
📌 上下文切换 = 性能杀手
taskset -c 0-3 pid
内核中:
cpumask_t cpus_allowed;
- 每个 task 有 preferred node
- 自动迁移(NUMA balancing)
📌 数据库强烈建议 NUMA 绑定
struct mm_struct {
pgd_t *pgd;
unsigned long total_vm;
unsigned long rss;
}
- fork 几乎 0 成本
- 写时复制
选择依据:
- oom_score
- 内存占用
- cgroup 限制
📌 容器 OOM ≠ 系统 OOM
常见信号
| 信号 | 含义 |
|---|---|
| SIGTERM | 优雅退出 |
| SIGKILL | 强制 |
| SIGSTOP | 停止 |
| SIGSEGV | 段错误 |
产生 -> 递送 -> 处理
📌 SIGKILL 无法被捕获
systemd / Docker / K8S 的根基
- CPU
- Memory
- IO
- PIDs
task -> cgroup -> controller
| Namespace | 隔离内容 |
|---|---|
| PID | 进程号 |
| Mount | 文件系统 |
| Network | 网络 |
| User | UID/GID |
📌 容器 = namespace + cgroup + rootfs
systemd (1)
├─ sshd
│ └─ bash
├─ nginx
└─ postgres
- 父子关系
- reparent 到 PID 1
已死,未收尸
原因:
- 父进程未 wait()
解决:
- kill 父进程
- 修复代码
kernel.pid_max
kernel.threads-max
kernel.sched_migration_cost_ns
- 进程就是容器
- PID namespace 是关键
- NUMA + CPU 亲和性
- 避免频繁 fork
- vCPU = 调度实体
- steal time 影响调度
Linux 进程管理的本质:task_struct + 调度器 + 内存管理 + cgroup + namespace