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


42

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


回答:


39

ウィキペディアは言います、

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

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

AIXなどの一部のUnix実装では、それほど単純ではないポリシーを使用しています。たとえば、このFAQを参照してください


答えてくれてありがとう。ちなみに、この「AIXポリシー」とは「単純ではない」とは一体何でしょうか?

1
@ Helltone、AIXが使用するポリシーを正確に文書化するとは思いません(したがって、どのリリースでも変更される可能性があります)が、適切な範囲の乱数生成と考えることができます(PIDが生成されるまで繰り返されます現在使用されていません)。
アレックスマルテリ

このアルゴリズムは私には少し問題があるようです。デッドロックに陥らないようにするにはどうすればよいですか?そして、パフォーマンスの問題はありませんか?

1
カーネルは制御されているため、何もロックする必要はありません。どうしてデッドロックになりますか?はい、わずかなパフォーマンスの代価を支払う必要があります(フォーク時に小さな余分なオーバーヘッドがあります-一致するPRNGまたは/ dev / urandomの読み取りには数ダースのマシン命令がありますが、カウンターインクリメントの場合はずっと少ないです)、それは常にですセキュリティの向上を目的とした対策の場合(たとえば、HTTPS通信とプレーンHTTPのCPUオーバーヘッドを確認してください;-)。
アレックスマル

ライブロック(while(true);)を意味し、申し訳ありませんが、すぐに答えました;-)

11

それは異なります。

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

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

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


9

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

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


これは非常に重要な詳細です。それがなくても簡単なmyprog &ことで、その後はwait $!UBだろう。
アンドレアス

3

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

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