这四个线程将具有相同的PID,但仅当从上方查看时才如此。什么,你(作为一个用户)调用PID是不是有什么内核(从下面看)调用PID。
在内核中,每个线程都有自己的ID,称为PID(尽管将其称为TID或线程ID可能更有意义),并且它们还具有TGID(线程组ID),它是线程的PID这开始了整个过程。
简而言之,当创建一个新进程时,它将显示为一个线程,其中PID和TGID都是相同(新)编号。
当一个线程启动另一个线程时,该启动的线程将获得其自己的PID(因此调度程序可以独立调度它),但是它从原始线程继承了TGID。
这样,内核可以愉快地调度线程,而与线程所属的进程无关,而将进程(线程组ID)报告给您。
以下线程层次结构可能会有所帮助(a):
USER VIEW
<-- PID 43 --> <----------------- PID 42 ----------------->
+---------+
| process |
_| pid=42 |_
_/ | tgid=42 | \_ (new thread) _
_ (fork) _/ +---------+ \
/ +---------+
+---------+ | process |
| process | | pid=44 |
| pid=43 | | tgid=42 |
| tgid=43 | +---------+
+---------+
<-- PID 43 --> <--------- PID 42 --------> <--- PID 44 --->
KERNEL VIEW
您可以看到,启动一个新进程(左侧)会为您提供一个新的PID 和一个新的TGID(两者都设置为相同的值),而启动一个新线程(右侧)会为您提供一个新的PID,同时保持相同的值TGID作为启动它的线程。
(a) 惊叹于我令人印象深刻的图形技巧:-)
getpid()
返回tgid:,asmlinkage long sys_getpid(void) { return current->tgid;}
如www.makelinux.com/中