Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Linux 进程管理(Process)

下面是一份 “内核级视角”的 Linux 进程管理(Process)核心子系统详解,不是 ps/top 用法,而是从内核数据结构、调度、状态、上下文切换到容器/NUMA 的完整认知框架。

适用 RHEL / AlmaLinux / Debian / Ubuntu / 云 / 容器 / 数据库 / 虚拟化。

一、进程在 Linux 内核中的本质

Linux 没有 “线程” 这种内核对象,只有 task(任务)。

1️⃣ task_struct(核心数据结构)

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
协程 用户态调度

二、进程 vs 线程(内核真实差异)

项目 进程 线程
PID 不同 不同
虚拟地址空间 独立 共享
文件描述符 独立 共享
调度单位 task task

📌 Linux 的线程 = 轻量级进程

三、进程生命周期(从出生到死亡)

1️⃣ 创建:fork / clone / vfork

fork()

  • 复制 task_struct
  • Copy-On-Write

clone()

  • 指定共享资源
  • 创建线程、容器的基础
clone(CLONE_VM | CLONE_FS | CLONE_FILES);

2️⃣ 执行:execve

fork -> execve -> 新程序

  • 替换用户态代码
  • 内核态 task_struct 不变

3️⃣ 退出:exit / _exit

exit -> ZOMBIE -> reaped

四、进程状态机(极其重要)

TASK_RUNNING
TASK_INTERRUPTIBLE
TASK_UNINTERRUPTIBLE (D)
TASK_STOPPED
TASK_ZOMBIE

D 状态(最可怕)

  • 等待 IO,不能被 kill

📌 数据库、存储、NFS 常见

五、调度子系统(Scheduler)

1️⃣ CFS(完全公平调度器)

核心思想:

按虚拟运行时间公平分配 CPU

vruntime = 实际运行时间 / 权重

2️⃣ 调度队列(Runqueue)

  • 每 CPU 一个 rq
  • 红黑树维护 task

3️⃣ 调度类

类别 场景
CFS 普通进程
RT 实时任务
Deadline 确定性延迟

4️⃣ 上下文切换(Context Switch)

切换内容:

  • CPU 寄存器
  • 内存页表(CR3)
  • 调度实体

📌 上下文切换 = 性能杀手

六、CPU 亲和性 & NUMA

1️⃣ CPU Affinity

taskset -c 0-3 pid

内核中:

cpumask_t cpus_allowed;

2️⃣ NUMA 感知

  • 每个 task 有 preferred node
  • 自动迁移(NUMA balancing)

📌 数据库强烈建议 NUMA 绑定

七、进程内存管理关联

1️⃣ mm_struct

struct mm_struct {
    pgd_t *pgd;
    unsigned long total_vm;
    unsigned long rss;
}

2️⃣ Copy-On-Write

  • fork 几乎 0 成本
  • 写时复制

3️⃣ OOM Killer

选择依据:

  • oom_score
  • 内存占用
  • cgroup 限制

📌 容器 OOM ≠ 系统 OOM

八、信号(Signal)

常见信号

信号 含义
SIGTERM 优雅退出
SIGKILL 强制
SIGSTOP 停止
SIGSEGV 段错误

信号处理流程

产生 -> 递送 -> 处理

📌 SIGKILL 无法被捕获

九、进程与 cgroups(现代核心)

systemd / Docker / K8S 的根基

1️⃣ 资源控制

  • CPU
  • Memory
  • IO
  • PIDs

2️⃣ 调度感知 cgroup

task -> cgroup -> controller

十、Namespace 与进程隔离

Namespace 隔离内容
PID 进程号
Mount 文件系统
Network 网络
User UID/GID

📌 容器 = namespace + cgroup + rootfs

十一、进程树(树状结构)

systemd (1)
 ├─ sshd
 │   └─ bash
 ├─ nginx
 └─ postgres
  • 父子关系
  • reparent 到 PID 1

十二、僵尸进程(Zombie)

已死,未收尸

原因:

  • 父进程未 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