这是一个纯粹的学术问题,因为这永远不会发生。
如果 PID 存储为 pid_t 类型,而不是某种任意精度类型,那么一次可以存在的 PID 数量是有限制的。PID 溢出时是否有定义的行为?
第 65536 个进程会杀死 /sbin/init 并造成内核恐慌吗?或者有什么安全措施?
Kei*_*son 11
POSIX 没有指定每个新进程的 PID 是通过增加前一个 PID 来获得的。它只要求它是唯一的。
在每个 PID 递增的系统上fork()
,我观察到这些值在达到某个上限(根据我的经验约为 2 15)后会回绕。回绕后,新的 PID 不会严格递增,因为某些 PID 值仍会从以前的循环中使用。
除非您有 2 N 个 同时运行的进程,否则应该不会有问题。我怀疑系统会在发生这种情况之前很久就遇到一些容量限制。在这种情况下,fork()
系统调用将失败并可能设置errno
为EAGAIN
或ENOMEM
(man fork
详细信息)。
实现的代码fork
可能会也可能不会检查是否有任何 PID 可用。它可能不会打扰,因为它假设系统资源在到达那个点之前已经用完,或者为了完整性和处理未来的可能性,它可能会进行显式检查。我没有检查过,如果我检查过,我只能解决我看过的任何内核。
更新:在我当前的系统(Ubuntu 20.04)上,最大 PID 为 2 22,如下所示:
$ cat /proc/sys/kernel/pid_max
4194304
Run Code Online (Sandbox Code Playgroud)
来自man proc
:
/proc/sys/kernel/pid_max (Linux 2.5.34 起)
此文件指定 PID 环绕的值(即,此文件中的值比最大 PID 大 1)。不分配大于此值的 PID;因此,此文件中的值还充当系统范围内进程和线程总数的限制。此文件的默认值 32768 产生与早期内核相同的 PID 范围。在 32 位平台上,32768 是 pid_max 的最大值。在 64 位系统上,pid_max 可以设置为最多 2^22(PID_MAX_LIMIT,大约 400 万)的任何值。
但是特定的最大值可能与问题没有太大关系,除了您拥有 4+ 百万个进程的可能性比拥有超过 32767 个进程的可能性更小。