ゾンビプロセス(Zombie Process)とは、UNIXやLinuxなどのオペレーティングシステムで、終了はしているものの、親プロセスが子プロセスの終了状態をまだ回収していないため、プロセステーブルに残存しているプロセスのことです。
「ゾンビ」という名前は、既に「死んでいる」にもかかわらず、プロセスがシステム内に残り続けることに由来しています。ゾンビプロセスが増加すると、システムリソースの無駄遣いを招き、OSのパフォーマンスに悪影響を与える可能性があります。
ゾンビプロセスが発生する仕組み
プロセスが終了すると、OSはそのプロセスの終了情報(プロセスID、終了コードなど)をプロセステーブルに保持し、親プロセスに終了ステータスを通知するまでプロセステーブル内にその情報が残ります。通常は以下の流れで処理されます。
- 子プロセスの終了
子プロセスが終了すると、終了コードがプロセステーブルに記録され、親プロセスにその終了状態を通知します。この段階でプロセスは「ゾンビ」状態になります。 - 親プロセスによる回収
親プロセスがwait
システムコールを呼び出し、終了した子プロセスの状態を回収することで、プロセステーブル内の子プロセスの情報が削除され、プロセステーブルが解放されます。 - ゾンビプロセスの残存
しかし、何らかの理由で親プロセスが子プロセスの終了を回収しない場合、プロセステーブルに情報が残り続け、ゾンビプロセスとしてシステムに滞留します。
ゾンビプロセスの影響
ゾンビプロセスそのものは既に実行されていないため、CPUやメモリのリソースを消費することはありません。しかし、プロセステーブルのエントリを占有し続けるため、大量のゾンビプロセスが発生するとプロセステーブルが溢れてしまい、システムに新しいプロセスを生成できなくなる可能性があります。また、親プロセスが何らかのエラーで終了状態を回収できない場合、システム全体の安定性に影響が出る場合もあります。
ゾンビプロセスの確認と対策
ゾンビプロセスの確認方法
ゾンビプロセスが存在するかどうかは、以下のコマンドで確認することができます。
ps
コマンド
ps aux | grep Z
ps
コマンドを使用すると、プロセスの状態が「Z」または「Z+」と表示されるものがゾンビプロセスです。top
コマンド
top
コマンドでシステムの全プロセスを確認すると、状態が「Z」と表示されるプロセスがゾンビプロセスです。
ゾンビプロセスの対策
ゾンビプロセスの数が少数であればシステムに大きな影響はありませんが、放置すると問題が発生する可能性があります。以下の対策が有効です。
- 親プロセスの終了
ゾンビプロセスの親プロセスを終了することで、オペレーティングシステムが自動的にゾンビプロセスを回収し、プロセステーブルが解放されます。 - 再起動
親プロセスがシステムプロセスであったり、終了できない場合は、システム全体を再起動することが最も確実な方法です。再起動するとプロセステーブルがリセットされ、ゾンビプロセスも削除されます。 - プログラムの修正
ゾンビプロセスが多発する原因が特定のプログラムであれば、そのプログラムにwait
システムコールを追加するなど、親プロセスが子プロセスの終了を適切に回収できるように修正します。 - 孤児プロセス化(initプロセスによる回収)
親プロセスを終了させて子プロセスを「孤児プロセス」にすると、孤児プロセスは自動的にinitプロセス(プロセスID 1)に引き継がれ、initプロセスがゾンビプロセスを回収します。例えば、kill
コマンドを使って親プロセスを終了することが有効です。
まとめ
ゾンビプロセスは、親プロセスが子プロセスの終了状態を回収しないことで発生するプロセスであり、システムリソースには直接影響しませんが、大量に発生するとプロセステーブルの容量を圧迫し、システム全体の安定性に悪影響を与える可能性があります。ゾンビプロセスの対策として、wait
システムコールの適切な実装や、親プロセスの終了、システム再起動などが有効です。ゾンビプロセスの特性を理解し、システム管理者や開発者は予防的な対策を講じて、システムの安定性と効率を確保することが重要です。