如果线程共享相同的PID,那么它们如何被识别?

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

Linux没有明确的线程支持。 在用户空间中,我们可以使用线程库(如NPTL)来创build线程。 现在,如果我们使用NPTL它支持1:1映射。

内核将使用clone()函数来实现线程。

假设我已经创build了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(尽pipe将其称为TID或线程ID可能更有意义),并且它们也具有作为线程的PID的TGID(线程组ID)开始了整个过程。

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

当一个线程启动另一个线程时 ,启动的线程将获得自己的PID(因此调度器可以独立调度),但是它inheritance了原始线程中的TGID。

这样,内核可以愉快地调度线程,而不pipe它们属于哪个进程,而进程(线程组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 惊叹于我令人印象深刻的graphics技能:-)

线程使用PID和TGID(线程组ID)来标识。 他们也知道哪个线程是谁的父母,所以本质上,一个进程与任何启动的线程共享PID。 线程ID通常由线程库本身来pipe理(比如pthread等)。 如果4个线程启动,他们应该有相同的PID。 内核本身将处理线程调度等,但是库是将要pipe理线程的线程(无论它们是否可以运行,取决于您使用线程连接和等待方法)。

注意:这是从我对内核2.6.36的回忆。 我在当前的内核版本中的工作是在I / O层,所以我不知道从那以后是否改变了。

Linux提供fork()系统调用与复制进程的传统function。 Linux也提供了使用clone()系统调用创build线程的能力。但是,linux并没有区分进程和线程。