これは決して起こらないので純粋に学問的な質問です。
PIDが任意の精度タイプではなくpid_tタイプとして保存されている場合、一度に存在できるPIDの数に制限があります。 PIDオーバーフローに対して定義された動作はありますか?
65536番目のプロセスは/ sbin / initを終了し、カーネルパニックを引き起こしますか?それとも安全対策がありますか?
答え1
POSIX は以前の PID を増やして、各新しいプロセスの PID を取得する必要はありません。ただ一意でなければなりません。
各PIDが増加するシステムでは、特定の上限(fork()
私の経験では約2 15)に達した後に値が変わることが観察されました。ラッピング後、一部のPID値はまだ古いサイクルの値を使用するため、新しいPIDは厳密に増加しません。
2Nになるまでは問題になりません。 同時に実行プロセス。私はこれが起こるずっと前にシステムにいくつかの容量制約があったようです。この場合、fork()
システムコールは失敗するか、またはerrno
に設定される可能性があります(詳細)。EAGAIN
ENOMEM
man fork
実装されたコードは、fork
PIDが利用可能かどうかを確認することも、確認しないこともあります。その時点に到達する前にシステムリソースが枯渇していると仮定するため、気にしないことも、完全性を明示的に確認し、将来の可能性を処理することもできます。まだ確認しておらず、もしそうなら、私が見たカーネルだけ解決できます。
アップデート:現在のシステム(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
答え3
最大PID制限は2^((sizeof(int)*CHAR_BIT)
。バラよりプロセスIDの最大値はいくらですか?。つまり、PIDは決して40億に近づくことはありません。
すべてのpidスロットがいっぱいになると、fork
呼び出しは失敗し始めますerrno==EAGAIN
(参照:フォーク(2))。すべてのスロットを埋めずに単に一番上に移動すると、次のPIDは1に続く空のスロットになります(1は初期化されます)。