ゾンビプロセスと孤児プロセス
ゾンビプロセスは終了済みなのに親に回収されず残る状態、孤児プロセスは親が先に死んだ子です。前者は wait での回収、後者は init による引き取りで処理されます。
- 1.ゾンビプロセスは、終了したのに親がまだ終了状態を回収していない、抜け殻のプロセスです。
- 2.親が子の終了を wait で受け取ると、ゾンビは回収(リープ)されて消えます。
- 3.孤児プロセスは親が先に死んだ子で、init(PID 1)が親として引き取り面倒を見ます。
プロセスの終了と「後始末」
プロセスは終了しても、すぐに完全には消えません。終了したことと、その 終了ステータス(正常終了か、何番で終わったか) を、親プロセス が受け取るまで、OS は最小限の情報を残しておきます。
なぜなら、子を起動した親は普通「子がどう終わったか」を知りたいからです。親が子の結末を受け取る操作を wait(回収・リープ) と呼びます。
pid_t pid = fork();
if (pid == 0) {
/* 子プロセス:何か処理して終了 */
} else {
int status;
wait(&status); /* 親が子の終了を回収する */
}
この「終了したことを親が受け取る」までの隙間に、ゾンビという状態が生まれます。
ゾンビプロセス:回収待ちの抜け殻
ゾンビプロセス とは、すでに終了したのに、親がまだ wait で回収していない プロセスです。実行はとっくに終わっていて、メモリやファイルなどの資源も解放済み。残っているのは プロセステーブル上のエントリ(PID と終了ステータスを保持する小さな枠)だけです。
つまりゾンビは 「終了報告を親が受け取るのを待っている抜け殻」 であり、これ自体は 正常な一時状態 です。親が wait すれば、エントリも消えてゾンビは成仏します。
子が終了してから親が wait するまでのわずかな間、子はゾンビになります。これはプロセス終了の正常な過程の一部です。問題になるのは、親が wait を怠ってゾンビが消えずに溜まり続けるときだけです。
なぜゾンビが問題になるのか
ゾンビ1体はごく小さな存在です。それでも放置は危険です。
- ゾンビは プロセステーブルのエントリを占有 し続ける
- 親が wait をサボると、子が終わるたびに ゾンビが溜まる
- プロセステーブルには上限があり、PID を食い尽くす と新しいプロセスを作れなくなる
親がwaitしない場合:
子1 終了 → ゾンビ(残る)
子2 終了 → ゾンビ(残る)
子3 終了 → ゾンビ(残る) ... エントリが溜まり続ける
ゾンビはすでに死んでいるので、SIGKILL を送っても消えません。消す唯一の方法は親に wait させることです。親がバグで wait しないなら、その親を終了させて、ゾンビを init(PID 1)に引き取らせて回収させます。長時間動くプログラムでは、子の終了を確実に回収する(SIGCHLD を処理して wait する等)設計が必須です。
孤児プロセス:親が先に死んだ子
逆に、子よりも先に親が終了 してしまうこともあります。残された子を 孤児プロセス(orphan process) と呼びます。
孤児は放っておかれるわけではありません。OS が 親を付け替え、システムの先祖である init(PID 1) が新しい親になります(この引き取りを re-parenting と呼びます)。
| 用語 | 状態 | 誰が処理するか |
|---|---|---|
| ゾンビプロセス | 子が終了済み・親が未回収 | 親が wait で回収 |
| 孤児プロセス | 親が先に終了・子は実行中 | init(PID 1)が引き取る |
init は、引き取った子が終了したら自動的に wait してくれる ため、孤児はゾンビになって溜まりません。これにより、親に先立たれた子も最終的にはきちんと後始末されます。
なお、親が終了した時点で生きている孤児(まだ実行中)と、その後 init が回収するゾンビは別物です。孤児 → 親が init に変わる → 子が終了 → init が wait → 消える、という流れになります。
まとめ
- ゾンビ は、終了済みだが親が 未回収 の抜け殻。残るのは終了ステータスを持つエントリだけ。
- 親が wait(回収) すればゾンビは消える。kill では消せない。
- ゾンビの放置は プロセステーブル/PID の枯渇 を招くため、確実な回収が必要。
- 孤児 は親が先に死んだ子で、init(PID 1)が引き取り 後始末する。
OS Article
ゾンビプロセスと孤児プロセスを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
ゾンビプロセス
比較で見る軸
難易度: intermediate / カテゴリ: OS / タグ数: 4
導入後に効く点
親が子の終了を wait で受け取ると、ゾンビは回収(リープ)されて消えます。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- OS
- タグ数
- 4
判断チェックリスト
- 自社の用途が「ゾンビプロセス / 孤児プロセス」に近いか確認する。
- 強みである「ゾンビプロセスは、終了したのに親がまだ終了状態を回収していない、抜け殻のプロセスです。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。