对于进程或轻量级进程,tgid 和 pid 是否有所不同?

对于进程或轻量级进程,tgid 和 pid 是否有所不同?

对于任何进程或任何轻量级进程,tgid 和 pid 都是相同的概念。

在 中/proc/${pid}/status,tgid 和 pid 是不同的字段。对于进程或轻量级进程,tgid 和 pid 是否有所不同?

谢谢。

答案1

当查看 时/proc/${pid}/statusTgid: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

相关内容