ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

linux内核原理--进程,线程

2026/8/16 14:06:15 拓冰建站 浏览量
linux内核原理--进程,线程 进程进程组会话线程父子进程线程组孤儿进程兄弟进程兄弟线程1.核心概念逐个解释进程Process操作系统资源分配的最小单位。拥有独立的虚拟地址空间、打开文件表、信号处理等资源。进程是程序的一次执行实例。线程Thread操作系统CPU 调度的最小单位。线程依附于进程共享进程的地址空间和资源但拥有独立的栈、寄存器、程序计数器。一个进程至少包含一个线程主线程。父子进程父进程通过 fork() 创建子进程。子进程继承父进程的部分属性环境变量、文件描述符、信号处理等但拥有独立的 PID 和地址空间写时复制 COW。子进程终止时父进程应通过 wait() 回收其资源否则子进程变为僵尸进程。兄弟进程由同一父进程创建的多个子进程互为兄弟进程。兄弟进程之间彼此独立无直接层级关联不共享地址空间通信需通过 IPC。孤儿进程父进程先于子进程终止子进程失去父进程。操作系统会将孤儿进程的 PPID 重新设置为 init 进程PID 1或 systemd 收养。孤儿进程不是异常状态被收养后可正常执行直至终止。进程组Process Group一个或多个进程的集合用于批量信号管理。每个进程组有一个进程组 IDPGID通常等于组长进程的 PID。同一管道线如 ls | grep | wc中的命令通常属于同一进程组。向进程组发送信号如 kill -9 -pgid可同时影响组内所有进程。会话Session一个或多个进程组的集合用于终端控制。会话首进程Session Leader通常是登录 Shell。一个会话可包含一个前台进程组和多个后台进程组。终端断开会向会话首进程发送 SIGHUP导致会话内进程默认终止。线程组Thread GroupLinux 特有的概念。同一进程内的所有线程属于同一个线程组。线程组 IDTGID等于主线程的 PID。用户态调用 getpid() 实际返回的是 TGID。线程组内的线程通过 clone() 创建共享 mm_struct地址空间、files_struct文件表等。kill -9 pid 会终止整个线程组即整个进程。兄弟线程同一进程内的多个线程互为兄弟线程。它们共享进程的地址空间、全局变量、堆、文件描述符等是最紧密的协作关系。通信成本极低直接内存读写但需通过锁、原子操作等机制同步。2.关系总览┌─────────────────────────────────────────────────────────────┐ │ 操作系统 │ │ ┌───────────────────────────────────────────────────────┐ │ │ │ 会话Session │ │ │ │ ┌─────────────────┐ ┌─────────────────────────┐ │ │ │ │ │ 进程组1│ │ 进程组2│ │ │ │ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ │ │ │ │ │ 进程 A │ │ │ │ 进程 B │ │ │ │ │ │ │ │ ┌───────┐ │ │ │ │ ┌───────┐ │ │ │ │ │ │ │ │ │ 线程1│ │ │ │ │ │ 线程1│ │ │ │ │ │ │ │ │ ├───────┤ │ │ │ │ └───────┘ │ │ │ │ │ │ │ │ │ 线程2│ │ │ │ └───────────┘ │ │ │ │ │ │ │ └───────┘ │ │ └─────────────────────────┘ │ │ │ │ │ └───────────┘ │ │ │ │ │ └─────────────────┘ │ │ │ └───────────────────────────────────────────────────────┘ │ │ │ │ 进程 A 和进程 B无亲缘关系通过 IPC 通信 │ │ 进程 A 的线程1/2兄弟线程共享地址空间 │ └─────────────────────────────────────────────────────────────┘3.层级关系与归属层级组成单位关键标识作用会话一个或多个进程组SID会话 ID终端控制、作业管理进程组一个或多个进程PGID进程组 ID信号批量分发进程一个或多个线程PID进程 ID资源分配、地址空间隔离线程组一个或多个线程TGID 主线程 PIDLinux 内核对线程的归类线程执行单元TID线程 IDCPU 调度4.Linux 中的 ID 辨析在 Linux 中这些概念通过不同的 ID 区分PID进程/线程的唯一标识。对主线程而言PID TGID对子线程而言PID 是其独立 TID。TGID线程组 IDgetpid() 的返回值。同一进程内所有线程 TGID 相同。PGID进程组 IDgetpgrp() 的返回值。SID会话 IDgetsid() 的返回值。PPID父进程 ID。