当您用尽PID时会发生什么?


8

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

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

65536进程会杀死/ sbin / init并引起内核崩溃吗?还是有一些安全措施?


2
stackoverflow.com/questions/6294133/maximum-pid-in-linux我想您可以更改最大值并找出;)

2
较小的数字确实会被重用(OpenBSD和其他人会随机使用PID),然后您可能会遇到其他一些限制(例如,由于所有进程而耗尽内存,或者交换死亡或OOM杀手死机),然后fork由于不存在而失败。 pid可用。
惊险

1
有关信息:我不认为我看到的PID大于2 ^ 15-1 = 32767。
thb

3
但是,两个建议的重复都没有真正回答这个问题。
朱莉·佩勒

1
目前尚不清楚您是在询问PID达到某个最大值(大约2 ^ 15还是大约2 ^ 32)时会发生什么,还是无法再分配新的PID时会发生什么呢? 。我认为您的问题不是两个已标记问题的重复;两者都问极限是什么,而不是超过极限时会发生什么。如果您更新问题以澄清您的要求,我将投票重新打开它。(您已经对两种可能的版本都有答案。)
Keith Thompson

Answers:


8

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

叉子

在以下情况下,fork()函数将失败:

[EAGAIN]

系统缺少创建另一个进程的必要资源,否则将超出系统对系统范围内执行的进程总数或由单个用户{CHILD_MAX}施加的限制。


9

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

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

在您同时运行 2 N 进程之前,应该不会有问题。我怀疑系统会在此之前很久就达到一定的容量限制。在这种情况下,fork()系统调用将失败,并且可能设置errnoEAGAINENOMEMman fork以获取详细信息)。

实现的代码fork可能会或可能不会检查是否有任何PID。它可能不会打扰,因为它假定系统资源在到达该点之前就已经用完,或者为了完整性和应对未来的可能性而进行了明确的检查。我没有检查过,如果有的话,我只能说我所看过的那个内核。


当然,我知道它永远不会发生,但是系统确实分配了有限数量的PID。我只想知道它用完时会发生什么。
Fred Frey

1
该答案实际上是唯一真正回答该问题的答案。该行为取决于系统,但是仅需要确保每个新进程的唯一pid。当然,您会受到配置的最大PID数量的限制,这在标记为重复的2个问题中有详细说明,但是除非系统正在运行容器或已安装的程序或脚本中存在严重错误,否则极不可能发生。
朱莉·佩勒捷

2

PID的最大限制远小于2^((sizeof(int)*CHAR_BIT)。请参阅进程ID的最大值是多少?。换句话说,您的PID永远不会接近40亿。

当所有pid插槽都装满后,fork调用将开始失败errno==EAGAIN(请参阅fork(2))。如果您只是在不填充所有插槽的情况下直接到达顶部,则下一个PID将是1(init为1)之后的下一个空闲插槽

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.