为什么进程不填充空进程ID

为什么进程不填充空进程ID

每个人都知道 PID 号 1 是 systemd (或类似的东西)。此后的每个进程都需要另一个 PID,不断累加。

但是,当有 50 个进程正在运行(最多 PID 50)并且 PID 2 的进程终止并且新进程启动时,它不会是 PID 2,而是 PID 51。这是为什么呢?

我注意到,例如对于文件描述符,情况并非如此,而是当我关闭文件描述符 4 并打开一个新的文件描述符时,它将具有数字 4。

答案1

大多数 Unix 变体按顺序分配进程 ID:1、2、3、4...当达到最大可能的 PID 值时,它们会再次从 1 开始,跳过已经存在的 PID。

这不是义务。例如,OpenBSD 随机分配 PID,而不是顺序分配;这也是 FreeBSD 上的一个选项。不过,目标是提高安全性其好处值得怀疑

这种行为有一个(可疑的)优点:它使得进程 ID 很少在进程终止后立即重用。有许多程序可以监视进程,并假设进程终止后,PID 将不再使用——如果 PID 被新进程使用,就会中断。这些程序确实有一个借口:除了父进程之外,没有好的 API 可以监视进程。但此类程序非常普遍,以至于 OpenBSD 在进程终止后一段时间内(如果我没记错的话,几分钟)避免重复使用 PID。

造成这种行为的主要原因是传统 Unix 系统上就是这样做的,并且没有强有力的理由进行更改。对于文件描述符,Unix 历史上使用第一个空闲 fd 编号,并且该行为已成为官方标准,因此所有 Unix/POSIX 系统都必须这样做。

相关内容