ゾンビプロセス
UnixおよびUnixライクなコンピューターオペレーティングシステムでは、 ゾンビプロセスまたは機能しないプロセスは、実行を完了した(exitシステムコールを介して)プロセスですが、プロセステーブルにまだエントリがあります:「終了状態」のプロセスです。これは、子プロセスの場合に発生します。親プロセスが子の終了ステータスを読み取るためにエントリが必要な場合、待機システムコールを介して終了ステータスが読み取られると、ゾンビのエントリがプロセステーブルから削除され、 「刈り取られる」。子プロセスは、リソーステーブルから削除される前に、常に最初にゾンビになります。ほとんどの場合、通常のシステム操作では、ゾンビはすぐに親によって待機され、その後システムによって回収されます。ゾンビに長時間とどまるプロセスは一般にエラーであり、リソースリークを引き起こします。
ゾンビプロセスという用語は、 ゾンビの一般的な定義、つまりアンデッドの人に由来します。この用語の比phorでは、子プロセスは「死んだ」が、まだ「改作されていない」。また、通常のプロセスとは異なり、killコマンドはゾンビプロセスには影響しません。
ゾンビプロセスを孤立プロセスと混同しないでください。孤立プロセスとは、まだ実行されているが、親が死んだプロセスです。親が死ぬと、孤立した子プロセスがinit(プロセスID 1)によって採用されます。孤立したプロセスが死ぬと、ゾンビプロセスとして残りません。代わりに、initによって待機されます。その結果、ゾンビと孤児の両方であるプロセスが自動的に収獲されます。
概要
プロセスが出口を介して終了すると、それに関連付けられているすべてのメモリとリソースの割り当てが解除されるため、他のプロセスで使用できます。ただし、プロセステーブル内のプロセスのエントリは残ります。親は、待機システムコールを実行することで子の終了ステータスを読み取ることができ、その時点でゾンビが削除されます。待機呼び出しはシーケンシャルコードで実行できますが、一般的にはSIGCHLDシグナルのハンドラーで実行されます。SIGCHLDシグナルは、子が死亡するたびに親が受信します。
ゾンビが削除された後、プロセス識別子(PID)とプロセステーブルのエントリは再利用できます。ただし、親がwaitの呼び出しに失敗すると、ゾンビがプロセステーブルに残り、リソースリークが発生します。状況によっては、これが望ましい場合があります-親プロセスはこのリソースを保持し続けたい-たとえば、親が別の子プロセスを作成する場合、同じPIDが割り当てられないようにします。 (この点でSUSv3仕様に準拠する)最新のUNIXライクシステムでは、次の特別なケースが適用されます:親がハンドラをSIG_IGNに設定することで(デフォルトで単に信号を無視するのではなく)SIGCHLDを明示的に無視するか、SA_NOCLDWAITフラグがある場合設定すると、すべての子の終了ステータス情報が破棄され、ゾンビプロセスは残りません。
ゾンビは、UNIXのpsコマンドからの出力で、「STAT」列に「Z」があることで識別できます。短期間以上存在するゾンビは、通常、親プログラムのバグ、または子を刈り取らないという珍しい決定を示しています(例を参照)。親プログラムが実行されていない場合、ゾンビプロセスは通常、オペレーティングシステムのバグを示しています。他のリソースリークと同様に、いくつかのゾンビの存在自体は気になりませんが、負荷が重いと深刻になる問題を示している場合があります。ゾンビプロセスに割り当てられたメモリがないため(システムメモリの使用量はプロセステーブルエントリのみ)-多くのゾンビの主な関心事はメモリ不足ではなく、プロセステーブルエントリ、具体的にはプロセスID番号の不足です。
システムからゾンビを削除するには、killコマンドを使用して、SIGCHLDシグナルを手動で親に送信できます。親プロセスが依然としてゾンビの刈り取りを拒否し、親プロセスを終了しても問題ない場合、次のステップは親プロセスを削除することです。プロセスが親を失うと、initはその新しい親になります。 initはwaitシステムコールを定期的に実行して、initを親とするゾンビを獲得します。
例
特定の子プロセスを(特定の)順序で同期的に待機すると、上記の「短時間」よりも長くゾンビが存在する可能性があります。必ずしもプログラムのバグではありません。