进程和线程的pid
程序创建进程,一个进程至少创建一个线程,程序的运行最终是靠线程来完成的。
有人说在 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 的联系和区别
描述父子进程,线程之间关系图:
1 | USER 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 通过进程查看线程的方法
htop
按 t(显示进程线程嵌套关系)和 H(显示线程) ,然后 F4 过滤进程名ps -eLf | grep java
(快照,带线程命令,e 是显示全部进程,L 是显示线程,f 全格式输出)pstree -p <pid>
(显示进程树,不加 pid 显示所有)top -Hp <pid>
(实时)ps -T -p <pid>
(快照) 推荐程度按数字从小到大