PID是如何产生的?

Gio*_*hal 46 unix process algorithm

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

Ale*_*lli 41

正如维基百科所说,

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

所以这真的是一个非常简单的“生成”策略,只需增加一个计数器,然后“回收”,只需将数字环绕在最大值处并继续递增,直到找到分配给已完成并已完成的进程的数字已从进程表中删除。

某些 Unix 实现(例如 AIX)使用的策略不太简单,例如参见此 FAQ


Jon*_*ler 11

它因人而异。

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

其他具有安全意识的系统会随机生成一个数字并检查它是否未被使用。

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


fra*_*nkc 10

至于问题的回收部分,要记住的一件事是,一旦具有该 pid 的进程终止,该 pid 就不会变得可用。在该进程的父进程通过某种形式的 wait() 系统调用收集其子进程的终止状态之前,pid 不可用。终止但其父级尚未发出等待的子级称为僵尸,通常会在 ps 中显示为已失效。如果行为不端的父进程启动子进程并且不等待它们,则它可能会使 pid 系统挨饿。

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