假设我有 10 个进程,例如:
process p0 with PID 1.
process p1 with PID 2.
process p2 with PID 3.
process p3 with PID 4.
process p4 with PID 5.
process p5 with PID 6.
process p6 with PID 7.
process p7 with PID 8.
process p8 with PID 9.
process p9 with PID 10.
当我杀死一个进程时,例如:
kill 7
并且进程 p6 被成功杀死,进程 p5 和 p7 之间为空,当我将 p10 作为进程运行时,内核将 PID 11 分配给 p10。
问题是为什么内核(linux和freebsd)分配一个增量PID而不是分配PID 7给进程p11?
PID 在释放后不会立即被重用,因为这样做会导致竞争,并最终导致有时可以用来逃避安全限制的错误(请参阅这些由 PID 竞争导致的 Android 安全错误示例)。
如果 PID 被重用,那么无论出于何种原因(例如,向其他进程发送信号)持有 PID 的进程可能不会立即意识到他们打算与之通信的进程已经退出。一旦 PID 被回收,就很难可靠地检测到使用它的进程是否发生了变化。延迟这种重用会降低竞争的可能性(尽管并非不可能)。其他方法包括提高最大 PID(例如在 Fedora 上所做的 - 请参阅 参考资料
/proc/sys/kernel/pid_max
),但这只会降低可能性。Linux 内核最近添加了
pidfd
s来提供一种关于进程及其 PID 的可靠推理方式。