PID 是如何生成的?

PID 是如何生成的?

在 *nix 上,PID 是正在运行的进程的唯一标识符。PID 是如何生成的?它只是一个不断增加的整数吗?还是一个更复杂的结构,例如列表?它们是如何回收的?回收的意思是,当一个进程终止时,它的 PID 最终将被另一个进程重用。

答案1

作为维基百科说,

在 Unix 下,进程 ID 通常按顺序分配,从 0 开始,然后增加到最大值,最大值因系统而异。一旦达到此限制,分配将从零重新开始,然后再次增加。但是,对于此过程和后续过程,将跳过仍分配给进程的任何 PID。

因此,对于“生成”来说,这实际上是一个非常简单的策略,只需增加一个计数器和“回收”,只需将数字包装到最大值并不断增加,直到找到分配给已完成并已从进程表中删除的进程的数字。

一些 Unix 实现(例如 AIX)使用的策略不太简单,请参见此常见问题解答

答案2

它是因人而异的。

大多数系统只是简单地保留最后生成的 PID 的计数,然后加一(以最大数字包装,例如 65535 或稍小一些 - 通常以 65000 甚至 60000 包装),并检查该数字当前未被使用(如果 PID 仍在使用中则重复 - 因此 PID 1,即内核,仍然存在并且不会被“重新发布”)。

其他注重安全的系统会随机生成一个号码并检查该号码未被使用。

在任何给定时间,保证所有 PID 号码都是唯一的。

答案3

至于问题的回收部分,需要记住的一点是,pid 不会在具有该 pid 的进程终止后立即变为可用。直到该进程的父进程通过某种形式的 wait() 系统调用收集其子进程的终止状态后,pid 才会变为可用。已终止但其父进程尚未发出等待的子进程称为僵尸进程,通常会在 ps 中显示为已失效。如果行为不当的父进程启动子进程但不等待它们,则可能导致系统缺少 pid。

如果进程的父进程在收集子进程的状态之前死亡,那也没关系。子进程将由 init 继承,init 将确保发出 wait() 并回收 pid。

答案4

它们是序列号,如果系统运行时间足够长,则会循环(以特定于操作系统的值)。除非在 时它们是空闲的,否则数字永远不会被重复使用fork()

相关内容