「ゾンビプロセス」と「孤児プロセス」の違い
予備知識
| 用語 | 意味 |
|---|---|
| プロセス | メモリを使って何かやっているプログラムひとつひとつ |
| 親プロセス | プロセスからプロセスが生まれたときの最初からいた方のプロセス |
| 子プロセス | プロセスからプロセスが生まれたときの後から登場した方のプロセス |
| プロセステーブル | 現在動いているプロセスの管理台帳 |
プロセスは「メモリを使って何かやっているプログラムひとつひとつ」です。
よく分からなければ「実行中のプログラム」と読み替えてください。
プログラムは動いていればメモリを使っています。

プロセスがお仕事を始めると、管理台帳に名前が記録されます。

お仕事が終わると、管理台帳から名前が消されます。

管理台帳を見れば、今どんなプロセスがお仕事中か分かるようになっているのです。

それぞれの用語の意味
| 用語 | 意味 |
|---|---|
| ゾンビプロセス | もうお仕事は終わっているんだけど管理台帳にはまだ名前が残っているプロセス |
| 孤児プロセス | すでに親がいないので管理台帳から名前が消せなくなっている状態のプロセス |
似ているところ
どちらも、管理台帳上では「まだいるよ」状態になっているプロセスです。

また、孤児プロセスを指して「ゾンビプロセス」と表現している場合も あります。

違うところ
区別している場合は親プロセスの有無です。
ちょっと専門用語を使って説明しますが、親プロセス内で「fork()」というのをやると子プロセスが作られます。
このとき、管理台帳(プロセステーブル)に子プロセスの内容が記載されます。

子プロセスの処理が終了しました。
この時点ではプロセステーブルには、まだ子プロセスの内容が記載されています。
子プロセスの処理が終了した時点で、子プロセスはゾンビプロセスになるのです。

その後、親プロセスで「wait()」というのをやると、プロセステーブルから子プロセスの内容が消されます。

この時点で子プロセスは無事に成仏しました(-人-)
「wait()するとプロセステーブルから情報が消される」と覚えてください。
おっと、あるプロセスで問題発生です。
親プロセスがwait()しないで終了してしまいました。

おっと、別のプロセスでも問題発生です。
親プロセスが子プロセスより先に、さっさと終了してしまいました。

育児放棄というやつでしょうか。
いずれの場合も、このままでは子プロセスの名前をプロセステーブルから消せません。
wait()してくれる親プロセスが、すでにいないからです。

このような「育児放棄されて孤児になったプロセス」を(ゾンビプロセスと区別する場合は)「孤児プロセス」と呼びます。
孤児プロセスは、すでに親がいないのでプロセステーブルから名前を消せないプロセスです。
並べて書くと
ゾンビプロセス:処理が終了していてwait()待ちのプロセス
孤児プロセス:wait()しないで親プロセスが終了しちゃったプロセス
です。
個人的な使い分け
あまり使い分けは、していません。
孤児プロセスも「ゾンビプロセス」と表現することが多いです。
基本的には、それで通じるからです。
備考
孤児プロセスは長老に引き取られます。
すべてのプロセスのご先祖様である「initプロセス」というプロセスに引き取られ、以降はinitプロセスの子として扱われるのです。
そしてinitプロセスがwait()を実行したときに、プロセステーブルから情報が消されます。






