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


22

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

プロセスIDの最大値は何ですか?


2
そうですか?あなたのソースは何ですか?
ムル


これはLinuxに非常に特有のものです。一般的なUnixには適用されません。
ムル

完全な64ビット整数を使用することをお勧めします。これにより、それらが再利用されないことを保証できます。再利用は、IDを取得してから使用するまでの間にIDの意味が変わる競合状態につながります。
CodesInChaos

回答:


34

それは純粋にarbitrary意的な選択のようです。何でも構いませんが、誰か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 manページはそれが言う/proc/sys/kernel/pid_max2.5.34で追加され、見ていたのchangelog、それがどのように見える誰かがいたインゴ・モルナー

<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_MAX2.5.37でPID_MAX_LIMIT Linus Torvaldsによって追加されました

<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の現在の絶対制限は400万PIDです。これにより、カーネルで割り当てが発生することはなく、ビットマップはデマンド割り当てランタイムです。pidmapテーブルは512バイトを占有します。

より高い制限を設けることについては激しい議論がありましたが、最終的には何も出ていないようです。


2
stackoverflow.com/questions/3264283/…の手順を使用して、考古学に適したLinuxのより深い歴史を持つgitリポジトリを取得できます。これは、Ingo Molnarによるa5b5f6a "[PATCH] generic-pidhash-2.5.36-J2、BK-curr" であり、LWN見ることができます
ホッブズ

@hobbsすごい!結局のところ、インゴ・モルナーからです。なぜLinusがchangelogで所有権を取ったのだろうか。
ムル

1
@muru:BitKeeperはコミッターと著者の区別をサポートしていないと思います。これは、LinusがGitを設計したときに適用した教訓の1つでした。IIRC、IngoはBitKeeperの使用を拒否したため、メールごとにパッチを送信しましたが、BitKeeperにはオーサーシップの個別の概念がないため、自動生成されたChangeLogでコミッターに誤って属性が割り当てられました。とにかくそれは私の推測です。
ヨルグWミットタグ

@JörgWMittagが可能です。今、私はチェンジログを読み間違えていると思っています。そのビットは別のパッチに関するものかもしれません。
ムル

3
この回答の終わり近くにある引用は、任意の大きな値を選択しない理由がメモリの制約であることを示しています。1MのPIDあたり128 KBのRAMで、63ビット(符号ビットを残して)を使用する場合でも、計算に失敗しなければ、PIDテーブルだけで100万TBのRAMが必要になります。現在のシステムのハイサイドに少し。
CVn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.