Linux 进程概念: thread group, process group, session
目录
1. 概念
Thread Group(TGID)——进程内的线程集合Process Group 进程组(PGID)——作业(job)控制单元Session(SID)——Process Group的 高级聚合单元
它们存在于不同层级,但容易混淆。让我们逐步解析。
1.1 Thread Group(Linux 特有)
- 在
Linux中,进程和线程都是内核中的task_struct对象。 - 所谓
进程,本质上就是一个Thread Group,其中主线程(main thread)担任组长(group leader)角色,也即task_struct::group_leader。 - 每个线程都有一个
线程标识符(TID)——这是gettid()函数返回的值(内核内部)。 - 进程中的所有线程共享相同的
线程组标识符(TGID),该值等于主线程的进程标识符(PID)。在 Linux 中,getpid()函数实际上返回的是 TGID 而非 TID。 - 线程通过调用
clone()函数并指定CLONE_THREAD参数来创建,而进程是通过fork() 或 等同方式(如glibc的fork()封装为clone(CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD))。
Thread Group 示例:
Process "A" (PID/TGID=1000)
├─ Thread 1: TID=1000
├─ Thread 2: TID=1001
└─ Thread 3: TID=1002
- 所有线程均属于同一线程组(TGID=1000)。
- 从用户空间视角来看,这相当于“一个进程包含三个线程”。
1.2 Process Group (PGID)
- 源自
POSIX的作业控制(job control)抽象概念。 - 通过 setpgid() 和 getpgid() 创建/管理。
- 每个进程仅属于一个进程组。
- 进程组领导者:其进程 ID(PID)等于进程组 ID(PGID)的进程。
1.2.1 Process Group 的用途
- 用于向
Process Group发送信号(kill(-pgid, SIGINT))。 - 用于控制
shell的前台/后台任务(fg/bg)。 - 终端的前台
Process Group接收来自键盘的信号(Ctrl-C、Ctrl-Z)。
1.2.2 Process Group 示例
PGID=2000
├─ PID=2000 (leader, "bash")
├─ PID=2010 ("ls")
└─ PID=2011 ("grep foo")
- 所有这些进程都属于
Process Group 2000。 - 若按下
Ctrl-C,内核将向Process Group ID 2000(所有成员)发送SIGINT信号。
1.3 Session(SID)
Session一组Process Group的集合。- 由
setsid()函数创建。 Session Leader进程,即其进程标识符 PID 等于 SID 的进程。Session与控制终端相关联:- 若
Session Leader 进程未关联控制终端,可通过 ioctl(TIOCSCTTY) 获取控制终端。 - 该终端的
前台Process Group属于该Session的一部分。
- 若
Session 示例:
SID=2294 (session leader = bash)
├─ PGID=2294 (foreground job, bash + its pipeline)
│ ├─ PID=2294 bash
│ ├─ PID=2300 ls
│ └─ PID=2301 grep foo
└─ PGID=2400 (background job)
├─ PID=2400 sleep
└─ PID=2401 cat
1.3.1 bash 和 Session
- Bash 终端会话(类似于在 TTY 或 终端模拟器 上获得的登录 shell)是符合 POSIX 定义的会话(Session),其中 bash 作为会话领导者(Session Leader)。
- 但在另一个 shell 内部启动的普通 bash 并非新会话(Session),它只是同一会话(Session)内的子进程。
2. 小结
Thread Group(仅限 Linux):同一进程内的线程(通过clone(CLONE_THREAD)创建)。Process Group(POSIX):用于作业控制(Job control)和信号传递的进程集合。Session(POSIX):包含一个或多个Process Group,与终端绑定。
作个类比:
线程= 同公寓居民(共享厨房 = 地址空间)。Thread Group= 多个公寓组成团队(可作为整体管理)。Session= 一栋建筑(容纳多个团队(Thread Group),设有前台 = 控制终端)。

浙公网安备 33010602011771号