web-dev-qa-db-ja.com

ゾンビプロセスと孤立プロセス

ゾンビは、子が終了ステータスを読み取るために親プロセスが待機システムコールを使用しない場合に作成されます。孤児は、元の親プロセスが子の前に終了するときにinitによって回収される子プロセスです。

メモリ管理とプロセステーブルに関して、これらのプロセスは、特にUNIXでどのように異なる方法で処理されますか?

ゾンビや孤児の作成が、より大きなアプリケーションやシステムに悪影響を与える可能性がある場合の例または極端なケースは何ですか?

51
MarkAWard

子プロセスが終了すると、一部のプロセスはその上でwaitして終了コードを取得する必要があります。この終了コードは、これが発生するまでプロセステーブルに保存されます。その終了コードを読み取る動作は、子の「リーピング」と呼ばれます。子が出て刈り取られるまでの間は、ゾンビと呼ばれます。 (あなたがそれについて考えるとき、全体の命名法は少し恐ろしいです;私はそれについてあまり考えないことをお勧めします。)

ゾンビはプロセステーブルのスペースのみを占有します。メモリもCPUも必要ありません。ただし、プロセステーブルは有限のリソースであり、過剰なゾンビがそれを埋めることができるため、他のプロセスは起動できません。それを超えて、それらは煩雑であり、強く避けるべきです。

子がまだ実行されている状態でプロセスが終了すると(そして子を殺さず、比metaは奇妙なままです)、それらの子は孤児です。孤児の子供はすぐにinitに「採用」されます(実際、ほとんどの人はこれを「親子関係」と呼びますが、「養子縁組」は比metaをより良く伝えているようです)。孤児は単なるプロセスです。使用するリソースを使用します。親を持っているので、「孤児」ではないと言うのは理にかなっていますが、私は彼らがそう呼ばれるのをよく耳にします。

initは、自動的にその子(採用または別の方法)を取得します。したがって、子供を掃除せずに退出すると、子供はゾンビになりません(少なくとも一瞬以上)。

しかし、長生きするゾンビが存在します。彼らは何ですか?彼らは、彼らを刈り取っていない既存のプロセスの元の子です。プロセスがハングしている可能性があります。またはそれは不十分に書かれている可能性があり、その子供を刈り取るのを忘れています。それとも、それは過負荷であり、それを回避していません。または何でも。しかし、何らかの理由で、親プロセスは存在し続け(したがって、孤立していません)、待機していなかったため、プロセステーブルでゾンビとして生き続けます。

したがって、ゾンビが一瞬以上見られた場合、それは親プロセスに何か問題があることを意味し、そのプログラムを改善するために何かをすべきです。

86
Rob Napier

プロセスが終了すると、そのリソースはオペレーティングシステムによって割り当て解除されます。ただし、プロセステーブルにはプロセスの終了ステータスが含まれているため、プロセステーブルのエントリは、親がwait()を呼び出すまでそこに残っている必要があります。終了したが、親がまだwait()を呼び出していないプロセスは、zombie processと呼ばれます。すべてのプロセスは、終了するとこの状態に移行しますが、通常は短時間だけゾンビとして存在します。親がwait()を呼び出すと、ゾンビプロセスのプロセス識別子とプロセステーブル内のエントリが解放されます。

ここで、親がwait()を呼び出さずに代わりに終了し、その子プロセスをorphansのままにしておくとどうなるかを考えてみましょう。 LinuxおよびUNIXは、initプロセスを孤立プロセスの新しい親として割り当てることにより、このシナリオに対処します。 initプロセスは定期的にwait()を呼び出し、孤立したプロセスの終了ステータスを収集し、孤立したプロセス識別子とプロセステーブルエントリを解放します。

出典:Operating System ConceptsbyAbraham、Peter、Greg

15
opticod

孤立プロセスは、_parent process_が終了または終了したコンピュータープロセスですが、(子プロセス)自体は実行されたままです。
A ゾンビプロセスまたは機能しないプロセスは、実行を完了したが、親プロセスがwait()を呼び出さなかったため、プロセステーブルにまだエントリがあるプロセスです。システムコール。

10
Linkon
  1. 孤立はありませんが、プロセスはPID 1を使用しています。

    実行中のプロセスの観点からは、直接起動されたため、親としてPID 1を持っているか、元の親(PID 1とは異なる)が終了したためにPID 1に継承されたかに違いはありません。他のプロセスと同様に処理されます。

  2. 各プロセスは、終了時に何らかの種類のゾンビ状態、つまりSIGCHLDを発行して終了を通知し、その処理(配信または無知)を確認する段階を経ます。

ゾンビ状態になったとき、プロセスはシステムのプロセスリストの単なるエントリです。

ゾンビが排他的に使用している唯一の重要なリソースは、有効なPIDです。

2
alk

実行を終了したが、親プロセスに報告するプロセステーブルにまだエントリがあるプロセスは、ゾンビプロセスと呼ばれます。親プロセスがもう存在しないプロセス、つまり、子プロセスの終了を待たずに終了または終了したプロセスは、孤立プロセスと呼ばれます

1
SAURABH DUBEY