在 *nix 上,PID 是正在运行的进程的唯一标识符。PID 是如何生成的?它只是一个不断增加的整数吗?还是一个更复杂的结构,例如列表?它们是如何回收的?回收的意思是,当一个进程终止时,它的 PID 最终将被另一个进程重用。
答案1
答案2
它是因人而异的。
大多数系统只是简单地保留最后生成的 PID 的计数,然后加一(以最大数字包装,例如 65535 或稍小一些 - 通常以 65000 甚至 60000 包装),并检查该数字当前未被使用(如果 PID 仍在使用中则重复 - 因此 PID 1,即内核,仍然存在并且不会被“重新发布”)。
其他注重安全的系统会随机生成一个号码并检查该号码未被使用。
在任何给定时间,保证所有 PID 号码都是唯一的。
答案3
至于问题的回收部分,需要记住的一点是,pid 不会在具有该 pid 的进程终止后立即变为可用。直到该进程的父进程通过某种形式的 wait() 系统调用收集其子进程的终止状态后,pid 才会变为可用。已终止但其父进程尚未发出等待的子进程称为僵尸进程,通常会在 ps 中显示为已失效。如果行为不当的父进程启动子进程但不等待它们,则可能导致系统缺少 pid。
如果进程的父进程在收集子进程的状态之前死亡,那也没关系。子进程将由 init 继承,init 将确保发出 wait() 并回收 pid。
答案4
它们是序列号,如果系统运行时间足够长,则会循环(以特定于操作系统的值)。除非在 时它们是空闲的,否则数字永远不会被重复使用fork()
。