web-dev-qa-db-ja.com

PIDはどのように生成されますか?

* nixでは、PIDは実行中のプロセスの一意の識別子です。 PIDはどのように生成されますか?インクリメントされる整数だけなのか、それともリストなどのより複雑な構造なのか?彼らはどのようにリサイクルされますか?リサイクルとは、プロセスが終了すると、そのPIDが最終的に別のプロセスによって再利用されることを意味します。

43

wikipedia が言うように、

Unixでは、通常、プロセスIDは連続的に割り当てられ、0から始まり、システムごとに異なる最大値まで増加します。この制限に達すると、割り当てはゼロから再開され、再び増加します。ただし、これ以降のパスでは、プロセスに割り当てられているPIDはスキップされます。

したがって、これは「生成」の非常に単純なポリシーであり、カウンタをインクリメントして「リサイクル」するだけで、数値を最大値で折り返し、終了してプロセスに割り当てられた数値が見つかるまでインクリメントを続けます。プロセステーブルから削除されました。

AIXなどの一部のUnix実装では、それほど単純ではないポリシーが使用されています。 このFAQ

39
Alex Martelli

状況により異なります。

ほとんどのシステムは、生成された最後のPIDのカウントを保持し、1を追加して(65535などの最大数でラップする-少し小さい-多くの場合、ラップは65000または60000で発生します)、その数が現在使用されていないことを確認します( PIDがまだ使用されている場合は繰り返す-つまり、カーネルであるPID 1はまだそこにあり、「再発行」されない)。

他のセキュリティ志向のシステムはランダムに番号を生成し、それが使用されていないことを確認します。

常に、すべてのPID番号が一意であることが保証されています。

11

質問のリサイクルの部分については、そのpidを持つプロセスが終了するとすぐにpidが使用可能にならないことを覚えておく必要があります。 pidは、そのプロセスの親が何らかの形式のwait()システムコールを介して子の終了ステータスを収集するまで使用できません。終了したが、親が待機を発行していない子はゾンビと呼ばれ、通常、psに無効として表示されます。動作が悪い親が子を起動し、それらを待機しない場合、pidのシステムが不足する可能性があります。

プロセスの親が子のステータスを収集する前に死んだ場合、それは問題ありません。子は、wait()が発行され、pidがリサイクルされることを確認するinitによって継承されます。

9
frankc

それらはシーケンス番号であり、システムが十分に長い間稼働している場合は(OS固有の値で)循環します。 fork()の時点で解放されない限り、数値は再利用されません。

3
Donal Fellows