PID和TID有什么区别?
标准答案是PID用于进程,而TID用于线程。但是,我已经看到一些命令可以互换使用它们。例如,htop
有一个PID列,其中显示了相同进程的线程的PID(具有不同的值)。那么PID什么时候代表一个线程或一个进程?
答案 0 :(得分:80)
很复杂: pid 是进程标识符; tid 是线程标识符。
但实际上,内核并没有真正区分它们:线程就像进程一样,但是它们与同一个组的其他实例共享一些东西(内存,fds ......)
因此, tid 实际上是内核(线程)中可调度对象的标识符,而 pid 是共享的可调度对象组的标识符记忆和fds(过程)。
但是为了让事情变得更有趣,当一个进程只有一个线程(初始情况和旧时代唯一的一个)时, pid 和 tid 总是一样的。因此,任何与 tid 一起使用的函数都将自动使用 pid 。
值得注意的是,许多记录使用 pid 的函数/系统调用/命令行实用程序实际上使用 tids 。但如果效果是整个过程,你根本就不会注意到差异。
答案 1 :(得分:3)
实际上,Linux进程中的每个线程都是轻量级进程(LWP)。所以,人们可能会将线程称为一个过程......但肯定存在差异。 进程中的每个线程都有不同的线程ID(TID)并共享相同的进程ID(PID)。
如果您正在使用pthread库函数,那么这些函数不使用这些TID,因为它们是内核/操作系统级别的线程ID。
答案 2 :(得分:2)
根据man gettid
:
此调用返回的线程ID与POSIX线程ID(即pthread_self(3)返回的不透明值)不同。
因此,TID可能意味着两件不同的事情!
答案 3 :(得分:0)
pid和tid是相同的,除非创建进程时调用clone
CLONE_THREAD
(根据gettid
的手册页)。在这种情况下,您将获得唯一的线程ID,但属于同一线程组的所有线程共享相同的进程ID。
但是,我还记得阅读(虽然我找不到来源)可以缓存从getpid
返回的值。
[UPDATE]
有关缓存NOTES
的影响的讨论,请参阅pids
部分here。