64ビットLinuxシステムでPIDの最大値が2 ^ 22であるのはなぜですか?

64ビットLinuxシステムでPIDの最大値が2 ^ 22であるのはなぜですか?

2^62、2^31、または他のものではないのはなぜですか?

プロセスIDの最大値はいくらですか?

答え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_max2.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 ...

しかし、IngoはちょうどDEFAULT_PID_MAXPID_MAX_LIMITLinus 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割り当てになり、pid_maxが100万の場合は128K空間になります。現在、pid_maxの絶対制限は400万PIDです。これによりカーネルへの割り当ては行われず、ビットマップは実行時に要求に応じて割り当てられます。 pidmapテーブルは512バイトを占めます。

より高い限度について熱心な議論がありましたが、結局何も出ていないようです。

関連情報