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() 或 等同方式(如 glibcfork() 封装为 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),设有前台 = 控制终端)。
posted @ 2025-10-02 13:33  JiMoKuangXiangQu  阅读(11)  评论(0)    收藏  举报