web-dev-qa-db-ja.com

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

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

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

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

8
Fred Frey

forkシステムコールは-1を返し、errno[〜#〜] eagain [〜#〜] に設定する必要があります。その後の処理は、forkを呼び出したプロセスによって異なります。

fork から:

Fork()関数は次の場合に失敗します:

[EAGAIN]

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

8
JigglyNaga

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

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

あなたが2を持っているまで問題はないはずですN同時実行プロセス。それが起こるずっと前に、システムが何らかの容量制限にぶつかるのではないかと思います。その場合、fork()システムコールは失敗し、おそらくerrnoEAGAINまたはENOMEMman fork 詳細については)。

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

9
Keith Thompson

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

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

2
PSkocik