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

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

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

进程ID的最大值是多少?

答案1

这似乎是一个纯粹任意的选择。可以是任何东西,但有人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 年,而它的价值至少也有那么久。


1联机帮助页说这/proc/sys/kernel/pid_max是在 2.5.34 中添加的,并查看变更日志,看起来像某人曾是英戈·莫纳尔:

<[email protected]>
    [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 ...

不过,英戈只是补充道DEFAULT_PID_MAXPID_MAX_LIMIT由 Linus Torvalds 添加于2.5.37:

<[email protected]>
    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 的绝对限制是 400 万个 PID - 这不会导致内核中的任何分配,位图是运行时按需分配的。 pidmap表占用512字节。

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

相关内容