为什么64位Linux系统中的最大PID为2 ^ 22?


22

为什么不2 ^ 62或2 ^ 31或其他?

进程ID的最大值是多少?


2
它是?你的来源是什么?
muru


这是非常特定于Linux的。通常,它不适用于Unix。
muru

我本来希望使用完整的64位整数,那样您可以保证它们永远不会被重用。重用会导致争用情况,在这种情况下,ID的含义在获取和使用ID的时间之间会发生变化。
CodesInChaos

Answers:


34

这似乎是纯粹的任意选择。可以是任何东西,但有人1认为400万就足够了。使用来源

/*
 * A maximum of 4 million PIDs should be enough for a while.
 * [NOTE: PID/TIDs are limited to 2^29 ~= 500+ million, see futex.h.]
 */
#define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE * 8 : \
    (sizeof(long) > 4 ? 4 * 1024 * 1024 : PID_MAX_DEFAULT))

git的历史似乎可以追溯到2005年,而且价值至少已经到了2005年。


1联机帮助页说它/proc/sys/kernel/pid_max是在2.5.34中添加的,并查看更改日志,看起来有人IngoMolnár

<mingo@elte.hu>
    [PATCH] pid-max-2.5.33-A0

    This is the pid-max patch, the one i sent for 2.5.31 was botched.  I
    have removed the 'once' debugging stupidity - now PIDs start at 0 again.
    Also, for an unknown reason the previous patch missed the hunk that had
    the declaration of 'DEFAULT_PID_MAX' which made it not compile ...

但是,Ingo仅添加了DEFAULT_PID_MAXPID_MAX_LIMIT是Linus Torvalds在2.5.37中添加的:

<torvalds@home.transmeta.com>
    Make pid_max grow dynamically as needed.

原来,我误读了变更日志。

更改在2.5.37补丁集中

diff -Nru a/include/linux/threads.h b/include/linux/threads.h
--- a/include/linux/threads.h   Fri Sep 20 08:20:41 2002
+++ b/include/linux/threads.h   Fri Sep 20 08:20:41 2002
@@ -17,8 +17,13 @@
 #define MIN_THREADS_LEFT_FOR_ROOT 4

 /*
- * This controls the maximum pid allocated to a process
+ * This controls the default maximum pid allocated to a process
  */
-#define DEFAULT_PID_MAX 0x8000
+#define PID_MAX_DEFAULT 0x8000
+
+/*
+ * A maximum of 4 million PIDs should be enough for a while:
+ */
+#define PID_MAX_LIMIT (4*1024*1024)

 #endif

这是我的搜索技能所能做到的。


多亏@hobbs,看来Ingo 毕竟是那个人。我上面引用的补丁是他首先发送的。从随附的LKML帖子中

新的PID分配器的内存占用量可通过/ proc / sys / kernel / pid_max动态扩展:默认的32K PID产生4K分配,100万的pid_max导致128K占用。pid_max的当前绝对限制为4百万个PID-这不会在内核中引起任何分配,位图是按需分配的运行时。pidmap表占用512个字节。

对于更高的限制进行了激烈的讨论,但最终似乎没有任何结果。


2
您可以使用stackoverflow.com/questions/3264283/…上的说明,获得一个适用于考古的具有更深Linux历史的git repo 。出现了Ingo Molnar的a5b5f6a“ [PATCH] generic-pidhash-2.5.36-J2,BK-curr”,在此处可以在LWN上查看
hobbs

@hobbs太棒了!毕竟是来自Ingo Molnar的。我想知道为什么Linus拥有变更日志的所有权。
muru

1
@muru:我相信BitKeeper不支持提交者和作者之间的区别,这是Linus在设计Git时应用的课程之一。在IIRC中,Ingo拒绝使用BitKeeper,因此他每封邮件都发送了补丁,由于BitKeeper没有单独的作者概念,因此补丁在自动生成的ChangeLogs中被误分配给提交者。无论如何,这是我的猜测。
约尔格W¯¯米塔格

@JörgWMittag可能。现在,我认为我误读了变更日志,而那可能是关于另一个补丁的问题。
muru

3
该答案末尾的引号表示未选择任意大值的原因是内存限制。如果每100万个PID的RAM为128 KB,那么即使我不搞乱数学运算,甚至使用63位(不带符号位),仅PID表就需要一百万TB的RAM。当前系统的优势偏高。
CVn 2015年
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.