我试图更好地理解内核如何实现pid命名空间。正在使用的基本结构之一是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.现在,不同的进程/线程可以共享相同的 tpid/gpid,但不能共享相同的 pid!那么为什么会有具有相同PID的任务列表呢?我错过了什么?
谢谢
结构
pid
是内核对进程标识符的内部概念。它可以识别进程、线程以及会话或进程组。这就是为什么有一个任务列表。
内核代码中解释说,这是以下两者之间的折衷:
- 仅存储不能保证过程标识的
pid_t
是您想要的,因为 PID 以循环方式重复使用 - 为每个进程线程存储指针,这会导致表太大