PIDが不足するとどうなりますか?


8

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

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

65536番目のプロセスで/ sbin / initが強制終了され、カーネルパニックが発生しますか?または、安全対策が講じられていますか?


2
stackoverflow.com/questions/6294133/maximum-pid-in-linux最大値を変更して調べることができると思います;)

2
低い数値は再利用され(OpenBSDやその他はPIDをランダム化)、おそらく他の制限(たとえば、すべてのプロセスのためにメモリが不足する、またはスワップデスまたはOOMキラーがワイルドになる)に達する前forkに、利用可能なpid。
2016

1
情報:2 ^ 15-1 = 32767より大きいPIDを見たとは思いません。
2016

3
どちらも提案された複製は、実際にはこの質問に答えません。
ジュリーペレティエ2016

1
PIDが最大値(約2 ^ 15か約2 ^ 32か)に達したときにどうなるか、または新しいPIDを割り当てることができなくなったときに何が起こるか(同じではない)を尋ねているのかどうかは明確ではありません。 。あなたの質問は、マークされた質問のいずれかと重複しているとは思いません。どちらも限界を尋ねるのであって、それを超えると何が起こるのかではない。質問の内容を明確にするために質問を更新した場合は、投票して再開します。(あなたはすでに両方の可能なバージョンへの回答を持っています。)
キース・トンプソン

回答:


8

forkシステムコールは-1を返し、セットすべきであるerrnoEAGAIN。その後に何が起こるかは、呼び出したプロセスによって異なりますfork

フォークから:

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

[EAGAIN]

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


9

POSIXは、各新しいプロセスのPIDが以前のPIDをインクリメントすることによって取得されることを指定していません。一意である必要があります。

PIDが各fork()でインクリメントされるシステムでは、値が上限(私の経験では約2 15)に達した後、値が折り返されることがわかりました。一部のPID値は以前のサイクルで引き続き使用されているため、ラップアラウンド後、新しいPIDは厳密にはインクリメントされません。

2 Nの プロセスを同時に実行するまで、問題は発生しません。それが起こるずっと前に、システムが何らかの容量制限に遭遇するのではないかと思います。その場合、fork()システムコールは失敗し、おそらく(または詳細)に設定さerrnoれます。EAGAINENOMEMman fork

実装forkするコードは、PIDが使用可能かどうかをチェックする場合としない場合があります。その時点に到達する前にシステムリソースが不足すると想定しているため、または完全性のために明示的なチェックがあり、将来の可能性を処理するために、気にしないかもしれません。私はチェックしていません。もし持っていた場合、私が見たカーネルにしか対処できませんでした。


もちろん、それが起こらないことは知っていますが、システムには割り当てるPIDの数に制限があります。それがなくなったときに何が起こるか知りたいだけです。
フレッドフレイ

1
この答えは実際に質問に本当に答える唯一のものです。動作はシステムに依存しますが、新しいプロセスごとに一意のPIDを確保する必要があるだけです。もちろん、重複としてマークされた2つの質問で詳述されているPIDの構成された最大量によって制限されますが、システムがコンテナーを実行しているか、インストールされているプログラムまたはスクリプトに重大なバグがない限り、発生することはほとんどありません。
ジュリーペレティエ

2

最大PID制限は、をはるかに下回り2^((sizeof(int)*CHAR_BIT)ます。プロセスIDの最大値はいくつですか?を参照してください。つまり、PIDが40億近くになることはありません。

すべてのpidスロットがいっぱいにforkなると、呼び出しが失敗し始めますerrno==EAGAINfork(2)を参照)。すべてのスロットを埋めずに単に上を打った場合、次のPIDは1の後の次の空きスロットになります(1はinit)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.