gpt4 book ai didi

multithreading - 如果线程共享相同的PID,如何识别它们?

转载 作者:行者123 更新时间:2023-12-03 04:58:27 25 4
gpt4 key购买 nike

我有一个与 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(线程group ID),即进程创建时创建的第一个线程的PID。

当创建一个新进程时,它会显示为一个线程,其中 PID 和 TGID 都是相同的(当前未使用的)数字。

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

这样,内核就可以愉快地调度线程,而不管它们属于哪个进程,同时向您报告进程(线程组 ID)。

以下线程层次结构可能会有所帮助(a):

                         USER VIEW
vvvv vvvv
|
<-- PID 43 -->|<----------------- PID 42 ----------------->
| |
| +---------+ |
| | process | |
| _| pid=42 |_ |
__(fork) _/ | tgid=42 | \_ (new thread) _
/ | +---------+ | \
+---------+ | | +---------+
| process | | | | process |
| pid=43 | | | | pid=44 |
| tgid=43 | | | | tgid=42 |
+---------+ | | +---------+
| |
<-- PID 43 -->|<--------- PID 42 -------->|<--- PID 44 --->
| |
^^^^^^ ^^^^
KERNEL VIEW

您可以看到,启动一个新的进程(在左侧)会为您提供一个新的 PID 一个新的 TGID(两者都设置为相同的值)。启动一个新线程(在右侧)会为您提供一个新的 PID,同时保持与启动它的线程相同的 TGID。

<小时/>

(a) 对我令人印象深刻的图形技能感到敬畏颤抖:-)

关于multithreading - 如果线程共享相同的PID,如何识别它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9305992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com