进程和线程的pid

本文最后更新于:2023年12月5日 晚上

程序创建进程,一个进程至少创建一个线程,程序的运行最终是靠线程来完成的。

有人说在 Linux 中,进程和线程是一样的,这种说法是不对的,线程和进程都有自己的 id

初步理解各种 id

  • pid: 进程 id

  • lwp: 线程 id,light weight process (thread) ID,也叫 spid 或 tid

    使用 ps 等工具查询的时候,线程的的 PID 是线程所在进程 id,SPID 才是线程 id

  • tgid: 线程组 id, 也就是线程组 leader 的进程 id, 等于 pid

  • ——- 分割线(以下内容不重要)———

  • pgid: 进程组 id, 也就是进程 leader 的进程 id

  • pthread id: pthread 库提供的 id, 生效范围不在系统级别, 可以忽略

  • sid: ession ID for the session leader

  • tpgid: tty process group ID for the process group leader

从上面可以看出: 各种 id 最后都归结到 pid 和 lwp 上。所以理解各种 id,最终归结为理解 pid 和 lwd 的联系和区别

描述父子进程,线程之间关系图:

               USER VIEW
 <-- PID 43 --> <----------------- PID 42 ----------------->
                     +---------+
                     | process |
                    _| pid=42  |_
                  _/ | tgid=42 | \_ (new thread) _
       _ (fork) _/   +---------+                  \
      /                                        +---------+
+---------+                                    | process |
| process |                                    | pid=44  |
| pid=43  |                                    | tgid=42 |
| tgid=43 |                                    +---------+
+---------+
 <-- PID 43 --> <--------- PID 42 --------> <--- PID 44 --->
                     KERNEL VIEW

上图很好地描述了用户视角(user view)和内核视角(kernel view)看到线程的差别:

  • 从用户视角出发,在 pid 42 中产生的 tid 44 线程,属于 tgid(线程组 leader 的进程 ID) 42。甚至用 ps 和 top 的默认参数,你都无法看到 tid 44 线程
  • 从内核视角出发,tid 42 和 tid 44 是独立的调度单元,可以把他们视为”pid 42”和”pid 44”

需要指出的是,有时候在 Linux 中进程和线程的区分也是不是十分严格的。即使线程和进程混用,pid 和 tid 混用,根据上下文,还是可以清楚地区分对方想要表达的意思。上图中,从内核视角出发看到了 pid 44,是从调度单元的角度出发,但是在 top 或 ps 命令中,你是绝对找不到一个 pid 为 44 的进程的,只能看到一个 lwp(tid)为 44 的线程

Linux 通过进程查看线程的方法

  1. htop按 t(显示进程线程嵌套关系)和 H(显示线程) ,然后 F4 过滤进程名
  2. ps -eLf | grep java(快照,带线程命令,e 是显示全部进程,L 是显示线程,f 全格式输出)
  3. pstree -p <pid>(显示进程树,不加 pid 显示所有)
  4. top -Hp <pid> (实时)
  5. ps -T -p <pid>(快照) 推荐程度按数字从小到大

进程和线程的pid
http://blog.lujinkai.cn/运维/基础/进程和计划任务/进程和线程的pid/
作者
像方便面一样的男子
发布于
2020年12月9日
更新于
2023年12月5日
许可协议