linux内核 – Linux – 线程和过程

我有一个查询相关的Linux中的线程的实现。

Linux没有显式的线程支持。在用户空间中,我们可能使用一个线程库(如NPTL)来创建线程。现在如果我们使用NPTL其支持1:1映射。
内核将使用clone()函数来实现线程。

假设我已经创建了4个线程。那么它意味着:
– 将有4个task_struct。
– 在task_struct内部,将根据克隆的参数提供共享资源(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)

现在我有以下查询:
1. 4个线程是否具有相同的PID。如果有人能详细说明,PID是如何共享的。
2.如何识别不同的线程;有没有一些tid(线程ID)的概念?

最佳答案
四个线程将具有相同的PID,但是仅当从上面观看时。你(作为用户)调用PID不是什么内核(从下面看)调用PID。

在内核中,每个线程都有自己的ID,称为PID(尽管调用这个TID或线程ID可能更有意义),并且它们还有一个TGID(线程组ID),它是线程的PID开始了整个过程。

简单地说,当创建一个新进程时,它显示为一个线程,其中PID和TGID都是相同的(新)数。

当线程启动另一个线程时,该启动线程获得自己的PID(因此调度程序可以独立调度),但它从原始线程继承TGID。

这样,内核可以快乐地调度独立于它们属于什么进程的线程,而进程(线程组ID)则会报告给您。

以下层次结构的线程可能有帮助1:

                      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。

1惊人的敬佩在我令人印象深刻的图形技能:-)

转载注明原文:linux内核 – Linux – 线程和过程 - 代码日志