PID和TID有什么区别?
标准答案是PID用于进程,而TID用于线程。 但是,我已经看到一些命令可以互换使用。 例如,htop有一列用于PID的列,其中显示了同一进程的线程的PID(具有不同的值)。 那么,PID何时表示线程或进程?
您可以更改htop设置以查看其他颜色的进程和线程。 它还有助于使用树视图。
这很复杂:pid是进程标识符; tid是线程标识符。
但是碰巧的是,内核并没有真正区分它们:线程就像进程一样,但是它们与同一组的其他实例共享某些东西(内存,fds ...)。
因此,tid实际上是内核(线程)中可调度对象的标识符,而pid是共享内存和fds(进程)的可调度对象组的标识符。
但是让事情变得更有趣的是,当一个进程只有一个线程(初始情况,在过去的好时光只有一个线程)时,pid和tid总是相同的。因此,任何与tid一起使用的功能都将自动与pid一起使用。
值得注意的是,许多与pid一起使用的函数/系统调用/命令行实用工具实际上都使用了tid。但是,如果影响是全过程的,您将根本不会注意到差异。
更有趣的是:源中也出现了名称tgid(线程组标识符),您已经可以猜到它与pid是同义词。
gettid()的tid与pthread_t tid不同,请参见man gettid
在此答案中使用的" fds"是什么意思?
@Stephen fds代表文件描述符,即代表打开的文件,套接字或类似对象的那些小整数。
实际上,Linux进程中的每个线程都是轻量级进程(LWP)。因此,人们可能将线程称为进程。但是肯定会有区别。
进程中的每个线程都有不同的线程ID(TID),并且共享相同的进程ID(PID)。
如果您正在使用pthread库函数,则这些函数将不使用这些TID,因为它们是内核/ OS级线程ID。
根据man gettid,仅用于添加其他答案:
The thread ID returned by this call is not the same thing as a POSIX thread ID (i.e., the opaque value returned by pthread_self(3)).
因此,TID可能意味着两种不同的含义!
pid和tid相同,除了使用CLONE_THREAD(根据gettid的手册页)调用clone创建进程时。在这种情况下,您将获得唯一的线程ID,但是属于同一线程组的所有线程共享相同的进程ID。
但是,我还记得(尽管找不到源)阅读了从getpid返回的值可能被缓存的情况。
[更新]
有关缓存pids的影响的讨论,请参见此处的NOTES部分。