对于任何进程或任何轻量级进程,tgid 和 pid 都是相同的概念。
在 中/proc/${pid}/status
,tgid 和 pid 是不同的字段。对于进程或轻量级进程,tgid 和 pid 是否有所不同?
谢谢。
答案1
当查看 时/proc/${pid}/status
,Tgid:
和Pid:
字段将始终匹配,因为它们对于进程或进程的主线程是相同的。
之所以有两个单独的字段,是因为使用相同的代码来生成/proc/${pid}/task/${tid}/status
,其中Tgid:
和Pid:
可能彼此不同。 (更具体地说,Tgid:
将匹配${pid}
并且将在上面使用的文件名模板中Pid:
匹配。)${tid}
命名有点令人困惑,主要是因为线程支持后来才添加到 Linux 内核中,并且当时修改了调度程序代码以重用用于调度进程的逻辑,因此现在可以调度线程。这导致重新使用“pid”的概念来识别各个线程。因此,实际上,从内核的角度来看,“pid”仍然用于线程,而“tgid”则被引入用于进程。但是在用户空间中,您仍然希望 PID 来识别进程,因此用户空间实用程序(例如ps
等)会将内核的“tgid”映射到 PID,并将内核的“pid”映射到“tid”(线程 ID)。
答案2
对于从进程领导者生成的线程,TGid 和 Pid 是不同的。
例如看看我的polkitd
过程:
% ps -Lp 2642
PID LWP TTY TIME CMD
2642 2642 ? 00:00:18 polkitd
2642 2680 ? 00:00:00 gmain
2642 2683 ? 00:00:30 gdbus
2642 2685 ? 00:00:00 polkitd
2642 2687 ? 00:00:00 JS GC Helper
2642 2688 ? 00:00:00 JS Sour~ Thread
2642 2692 ? 00:00:00 polkitd
如果我看一下流程2680
:
% egrep ^'(Tgid|Pid):' /proc/2680/status
Tgid: 2642
Pid: 2680