当 PID 用完时会发生什么?

fpf*_*pf3 10 process proc

这是一个纯粹的学术问题,因为这永远不会发生。

如果 PID 存储为 pid_t 类型,而不是某种任意精度类型,那么一次可以存在的 PID 数量是有限制的。PID 溢出时是否有定义的行为?

第 65536 个进程会杀死 /sbin/init 并造成内核恐慌吗?或者有什么安全措施?

Jig*_*aga 11

fork系统调用应该返回-1,并设置errnoEAGAIN。之后发生的事情将取决于调用fork.

叉子

如果出现以下情况,fork() 函数将失败:

[再次]

系统缺乏创建另一个进程所需的资源,或者系统对系统范围内或单个用户 {CHILD_MAX} 执行的进程总数的限制将被超过。


Kei*_*son 11

POSIX 没有指定每个新进程的 PID 是通过增加前一个 PID 来获得的。它只要求它是唯一的。

在每个 PID 递增的系统上fork(),我观察到这些值在达到某个上限(根据我的经验约为 2 15)后会回绕。回绕后,新的 PID 不会严格递增,因为某些 PID 值仍会从以前的循环中使用。

除非您有 2 N 个 同时运行的进程,否则应该不会有问题。我怀疑系统会在发生这种情况之前很久就遇到一些容量限制。在这种情况下,fork()系统调用将失败并可能设置errnoEAGAINENOMEMman 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 个进程的可能性更小。

  • 这个答案实际上是唯一真正回答问题的答案。该行为取决于系统,但只需要确保每个新进程都有唯一的 pid。当然,您会受到配置的最大 PID 数量的限制,这在标记为重复的 2 个问题中进行了详细说明,但除非您的系统正在运行容器,或者您在已安装的程序或脚本中存在严重错误,否则这种情况不太可能发生。 (2认同)