Gio*_*hal 46 unix process algorithm
在 *nix 上,PID 是运行进程的唯一标识符。PID是如何产生的?它只是一个递增的整数吗?或者是更复杂的结构,例如列表?它们如何被回收?通过回收,我的意思是,当一个进程终止时,它的 PID 最终将被另一个进程重用。
Jon*_*ler 11
它因人而异。
大多数系统只是保留最后生成的 PID 的计数,加一个(以最大数字包装,例如 65535 或更小一点 - 通常包装发生在 65000 甚至 60000),并检查该数字是否当前未使用(如果 PID 仍在使用中,则重复 - 所以 PID 1,即内核,仍然存在并且不会“重新发布”)。
其他具有安全意识的系统会随机生成一个数字并检查它是否未被使用。
在任何给定时间,都可以保证所有 PID 编号都是唯一的。
fra*_*nkc 10
至于问题的回收部分,要记住的一件事是,一旦具有该 pid 的进程终止,该 pid 就不会变得可用。在该进程的父进程通过某种形式的 wait() 系统调用收集其子进程的终止状态之前,pid 不可用。终止但其父级尚未发出等待的子级称为僵尸,通常会在 ps 中显示为已失效。如果行为不端的父进程启动子进程并且不等待它们,则它可能会使 pid 系统挨饿。
如果一个进程的父进程在它收集到一个子进程的状态之前就死了,那没关系。子进程由 init 继承,init 将确保发出 wait() 并回收 pid。