PIDが枯渇したらどうなりますか?

PIDが枯渇したらどうなりますか?

これは決して起こらないので純粋に学問的な質問です。

PIDが任意の精度タイプではなくpid_tタイプとして保存されている場合、一度に存在できるPIDの数に制限があります。 PIDオーバーフローに対して定義された動作はありますか?

65536番目のプロセスは/ sbin / initを終了し、カーネルパニックを引き起こしますか?それとも安全対策がありますか?

答え1

POSIX は以前の PID を増やして、各新しいプロセスの PID を取得する必要はありません。ただ一意でなければなりません。

各PIDが増加するシステムでは、特定の上限(fork()私の経験では約2 15)に達した後に値が変わることが観察されました。ラッピング後、一部のPID値はまだ古いサイクルの値を使用するため、新しいPIDは厳密に増加しません。

2Nになるまでは問題になりません。 同時に実行プロセス。私はこれが起こるずっと前にシステムにいくつかの容量制約があったようです。この場合、fork()システムコールは失敗するか、またはerrnoに設定される可能性があります(詳細)。EAGAINENOMEMman fork

実装されたコードは、forkPIDが利用可能かどうかを確認することも、確認しないこともあります。その時点に到達する前にシステムリソースが枯渇していると仮定するため、気にしないことも、完全性を明示的に確認し、将来の可能性を処理することもできます。まだ確認しておらず、もしそうなら、私が見たカーネルだけ解決できます。

アップデート:現在のシステム(Ubuntu 20.04)では、最大PIDは以下のように2 22です。

$ cat /proc/sys/kernel/pid_max
4194304

からman proc

/proc/sys/kernel/pid_max (Linux 2.5.34以降)

このファイルはPIDラップ値を指定します(つまり、このファイルの値は最大PIDより1大きいです)。この値より大きいPIDは割り当てられていないため、このファイルの値はプロセス全体とスレッド数のシステム全体の制限としても機能します。このファイルのデフォルト値である32768は、以前のカーネルと同じPID範囲を生成します。 32ビットプラットフォームでは、32768はpid_maxの最大値です。 64ビットシステムでは、pid_maxは最大2^22(PID_MAX_LIMIT、約400万)の値に設定できます。

ただし、特定の最大値は、32767を超えるプロセスよりも4 + 00000のプロセスを持つ可能性が低い場合を除き、問題との関連性が低い可能性があります。

答え2

システムforkコールは-1を返し、errno次に設定する必要があります。イガオン。その後に行われることは、呼び出しプロセスによって異なりますfork

~からクロス:

次の場合、fork() 関数は失敗します。

[再]

システムに別のプロセスを作成するために必要なリソースが不足しているか、システム全体または単一のユーザーが実行するプロセスの総数にシステムが課した制限である{CHILD_MAX}を超えています。

答え3

最大PID制限は2^((sizeof(int)*CHAR_BIT)。バラよりプロセスIDの最大値はいくらですか?。つまり、PIDは決して40億に近づくことはありません。

すべてのpidスロットがいっぱいになると、fork呼び出しは失敗し始めますerrno==EAGAIN(参照:フォーク(2))。すべてのスロットを埋めずに単に一番上に移動すると、次のPIDは1に続く空のスロットになります(1は初期化されます)。

関連情報