2

我试图更好地理解内核如何实现 pid namespace 。正在使用的基本结构之一是struct pid

struct pid { 
      atomic_t count;
      unsigned int level;
      /* lists of tasks that use this pid */
      struct hlist_head tasks[PIDTYPE_MAX];
      struct rcu_head rcu;
      struct upid numbers[1]; }

现在,据我了解,数字数组会跟踪不同 pid 命名空间中的进程不同的 pid。

我不明白的是tasks会员的目的。它在这里说:(LWN)

.." 该结构包含 ID 值,具有此 ID 的任务列表.."

所以我从中了解到,相同的pid在几个 proccess/tasks 之间共享。现在,不同的进程/线程可以共享相同的 tpid/gpid 但不能共享相同的 pid!那么为什么会有具有相同 PID 的任务列表呢?我错过了什么?

谢谢

4

1 回答 1

1

结构pid是内核的进程标识符的内部概念。它可以识别一个进程、一个线程,以及一个会话进程组。这就是为什么有一个任务列表。

内核代码中解释说,这是以下之间的折衷:

  • 仅存储pid_t不保证识别的进程是您想要的进程,因为 pid 以循环方式重用
  • 存储每个进程线程的指针,导致表太大
于 2018-04-16T17:57:37.320 回答