UNIXでは、プロセス番号はどのように割り当てられますか?

UNIXでは、プロセス番号はどのように割り当てられますか?

プロセステーブル()でPID番号を見ると、ps -aPIDは連続した番号ではなく、時には番号の間に大きな「間隔」があるため、どのパターンも見つかりません。短時間実行され、一部のPIDを保持するいくつかのプロセスがある可能性があるためですか?プロセス番号がリセットされる特定の範囲はありますか?

私はMac OS Xを使用していますが、答えは通常UNIXに適用する必要があるようです。

答え1

両方です。

多くのプロセスの寿命が短い。 PIDを取得、実行、完了すると、PIDはプロセステーブルから消えます。

プロセスは時々数分の1秒間だけ存在します!

通常、プログラムが起動すると、システム検証と環境初期化の一部として複数のコマンドが実行されます。

最大PID番号はシステムによって異なり、時には設定可能です。基本的にプロセス数が多い場合は、プロセス数を増やしたいと思うかもしれませんが、新しいオペレーティングシステムでは通常、ほとんどのワークロードに最大数で十分だと思います。

PIDはプロセステーブルのエントリであり、プロセステーブルが多いほどメモリを消費します。

この関連質問を確認してください。https://serverfault.com/questions/279178/what-is-the-range-of-a-pid-on-linux-and-solaris

また、これに関連する「ユーザーあたりの最大プロセス数」は、悪意のあるユーザーが意図的に多くのプロセスを作成してプロセステーブル全体を占有するのを防ぐための措置であることに注意してください。

答え2

いくつかの最新のカーネルは、セキュリティを強化するために新しいプロセスにランダムなPIDを割り当てるように設定することもできます。少なくともLinuxとFreeBSDはsysctl設定でこれを行うことができますが、OpenBSDは常にそうします。このような場合は、番号付けパターンについてはあまり言及できません。

答え3

UNIXのプロセスは非常に軽量で安価で、次のようにして誕生しました。フォーク(!)

これ分岐この側面は、しばしばユーザー、システム管理者、およびプログラマー、特にWindowsなどのいわゆる「生成」指向システムのユーザーを混乱させます。

Windowsはフォークできません。スレッドのみ分岐できます。(技術的にフォークできますが、このAPIはWINAPIプログラムからアクセスできません。)

つまり、UNIX では、フォークは Windows プロセスの生成よりもスレッド生成に似ています。初期プロセスを独自に分割し、子プロセスは親プロセスのコピーを実行し、両方ともブランチポイントまで同じデータと履歴を共有します(各レコードは遅いが着実に分岐し始めます)。

他の答えですでに述べたように、これらすべて(安価で高速で軽量)は、PIDが非常に速く現れて消えることを意味します。

インターネットサーバーを作成する従来のUNIX方式は、接続固有のモデルを使用することです。これは、基本的に各接続に対して新しいPIDを作成することを意味します。

httpサーバーを提供する非常に忙しいイメージのコンテキストを考えてみましょう。画像がリモートクライアントに表示されるたびに、これは新しいPIDが分岐し、画像データが読み取られ送信され、すべての部分でPIDが消費されることを意味します。 1秒間非常に速く、継続的に発生します。今日まで、従来のFTPと多くの軽量httpサーバーはまだこのように書かれています。

もはや存在しないUNIXのもう一つの初期の奇妙な側面です。死んだプロセスPIDを公開しないでください!特定のPIDプロセスが終了すると、何らかの方法で残りのPIDに影響を与えることはできません。ただし、このPIDはまだ割り当てられており、システムプロセステーブルを占有/占有します。

なぜそんなことですか?プログラム終了コードの値とプロセスのさまざまなアカウントカウンタがプロセステーブルPIDの下に格納されるためです。

これにより、CPUおよびメモリ統計プログラムは、シャットダウン後も子プロセスに関する情報を読み取ることができます。

当社は、無効な会計記録を以下のように指します。ゾンビ

これは、特定のゾンビプロセスが処理されるまで、そのPIDを新しいブランチプロセスで再利用できないことを意味します(つまり、非常に単純な線形PID割り当て方式を使用するUNIXシステムでは、処理を待っている複数のゾンビプロセスのために「バグ」発生する可能性があります。

プロセスの親プロセスは以下を担当します。「収穫」ゾンビつまり、アカウント情報を消費してゾンビのPIDを「無料PID」プールに返し、他のフォークされたプロセスで再利用できるようにします。

これらすべての事実を考慮すると、PID生成が最初の「空になった」PIDを再利用する傾向がある単純な線形アルゴリズムであっても、さまざまなシステム操作(親ゾンビの収穫など)のためにPIDが絶対に厳しい線形成長をしないことわかります。

すべての最新システムでは完全にランダムなPID割り当てアルゴリズムを有効にできますが、OpenBSDは基本的にこれを実行する唯一のアルゴリズムです。

したがって、私たちは常にPIDを完全に不透明な識別子として扱うべきです。

関連情報