![PID 和增量方法](https://linux22.com/image/168136/PID%20%E5%92%8C%E5%A2%9E%E9%87%8F%E6%96%B9%E6%B3%95.png)
假设我有 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?
答案1
PID 一旦被释放就不会被重用,因为这样做会导致竞争,并最终导致有时可用于逃避安全限制的错误(请参阅这些由 PID 竞争引起的 Android 安全错误示例)。
如果重用 PID,则无论出于何种原因持有 PID 的进程(例如,向其他进程发送信号)可能不会立即意识到他们打算与之通信的进程已经退出。一旦PID被回收,就很难可靠地检测到使用它的进程是否发生了变化。延迟这种重用会降低竞争的可能性(尽管并非不可能)。其他方法包括提高最大 PID(如所做的那样)例如在 Fedora 上 — 请参阅/proc/sys/kernel/pid_max
),但这同样只会降低可能性。
Linux 内核最近添加了pidfd
s提供一种可靠的方式来推理进程及其 PID。