ゾンビプロセス
プロセスだよ
もういないのに、まだいることになっているよ
簡単に書くよ
ゾンビプロセス(英:zombie process)とは
実際には、もういないのに管理上は「まだ、いるよ」状態になっているプロセス
(本当は ちょっと違うけど、実行中のプログラムのことだと思って いいです)のこと
です。
詳しく書くよ
順番に見ていきましょう。
まずは予備知識として「プロセス」について簡単に説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。
プロセスは「メモリを使って何かやっているプログラムひとつひとつ」です。
よく分からなければ「実行中のプログラム」と読み替えてください。
プログラムは動いていればメモリを使っています。
プロセスがお仕事を始めると、管理台帳に名前が記録されます。
お仕事が終わると、管理台帳から名前が消されます。
管理台帳を見れば、今どんなプロセスがお仕事中か分かるようになっているのです。
以上を踏まえて
もうお仕事は終わっているんだけど管理台帳にはまだ名前が残っているプロセス
が「ゾンビプロセス」です。
もういないのに、まだいることになっているプロセスです。
例えば、そうですね。
ピヨ太ママは高級会員制秘密クラブ「ライナックス」のメンバーです。
ライナックスでは、入るときに台帳に名前を書きます。
出るときに台帳から名前を消します。
これがルールです。
こうしておくことで、ライナックス側では台帳を見れば遊びに来ている人を把握できます。
何人遊んでいるかも分かるので、いろいろと便利なのです。
このライナックスに、ピヨ太ママがピヨ太君を連れて遊びに来ました。
ルールに従い、入口でピヨ太ママの名前とピヨ太君の名前を書きます。
ひとしきりライナックスを満喫したピヨ太君は、お家に帰りました。
ピヨ太ママは、まだノリノリで遊んでいます。
ピヨ太ママはノリノリで遊んでいます。
本当は(もう帰ったので)ピヨ太君の名前を消さないといけないのですが、面倒くさいので放置しています。
そうすると、どうなると思いますか?
そうですね。
ピヨ太君は、まだいることになってしまいます。
ピヨ太君は、もうライナックスの中には、いません。
でも台帳上は、まだピヨ太君はライナックスの中で遊んでいることになっています。
このお話におけるピヨ太君がゾンビプロセスです。
もういないのに、まだいることになっていますよね。
「ゾンビプロセス」という用語は、UNIX系(Linuxとか)の話で よく出てきます。
UNIX系では、動いているプロセスを「プロセステーブル」と呼ばれる台帳に書いて管理しています。
プロセスが開始されるとプロセステーブルに記載され、終了するとプロセステーブルから消されるのです。
このプロセステーブル上にまだ記載されている(生きていることになっている)けど、実際には処理が終了している(死んでいる)プロセスがゾンビプロセスです。
死んでいるのに生きているからゾンビなんでしょうね。
以上で雰囲気重視の説明は終わりです。
次に、もう少し専門的な説明をします。
余裕がある方は頑張って読んであげてください。
脳みそから煙が出そうな人は無理する必要ありません。
ゆっくり休んでください。
あっ、読んでくださるのですね。
ありがとうございます。
それでは、いってみましょう。
まず、親プロセス内で「fork()」というのをやると子プロセスが作られます。
このとき、管理台帳(プロセステーブル)に子プロセスの内容が記載されます。
子プロセスの処理が終了しました。
この時点ではプロセステーブルには、まだ子プロセスの内容が記載されています。
子プロセスの処理が終了した時点で、子プロセスはゾンビプロセスになるのです。
その後、親プロセスで「wait()」というのをやると、プロセステーブルから子プロセスの内容が消されます。
この時点で子プロセスは無事に成仏しました(-人-)
「wait()するとプロセステーブルから情報が消される」と覚えてください。
おっと、あるプロセスで問題発生です。
親プロセスがwait()しないで終了してしまいました。
おっと、別のプロセスでも問題発生です。
親プロセスが子プロセスより先に、さっさと終了してしまいました。
育児放棄というやつでしょうか。
いずれの場合も、このままでは子プロセスの名前をプロセステーブルから消せません。
wait()してくれる親プロセスが、すでにいないからです。
一般的には、このような孤児になったプロセスを指して「ゾンビプロセス」と言います。
親プロセスの育児放棄により、お仕事が終わったのに後始末をしてもらえなかった(プロセステーブルから情報が消されなかった)プロセスです。
孤児になったプロセスは長老に引き取られます。
すべてのプロセスのご先祖様である「initプロセス」というプロセスに引き取られ、以降はinitプロセスの子として扱われるのです。
そしてinitプロセスがwait()を実行したときに、プロセステーブルから情報が消されます。
注意点として、世の中には「孤児プロセス」という用語もあります。
こだわり派な人は「ゾンビプロセス」と「孤児プロセス」を区別しています。
その場合は
ゾンビプロセス:処理が終了していてwait()待ちのプロセス
孤児プロセス:wait()しないで親プロセスが終了しちゃったプロセス
という区別です。
ゾンビプロセスは親プロセスがいます。
ただし、wait()してもらえていないので、お仕事は終わっているのにプロセステーブルには情報が残った状態です。
孤児プロセスは親プロセスがいません。
すでに親プロセスが終了してしまっているので、いくら待ってもプロセステーブルから情報が消えません。
区別している場合は、そのような区別です。
気が向いたら、頭の片隅にでも置いておいてあげてください。
ちなみに、私自身は孤児プロセスも「ゾンビプロセス」と表現することが多いです。
基本的には、それで通じるからです。
一言でまとめるよ
まぁ「ゾンビプロセス」って単語が出てきたら「もういないのに、まだいることになっているプロセス
(本当は ちょっと違うけど、実行中のプログラムのことだと思って いいです)なんだな~」と お考えください。
おまけ
■訳してみるよ
「zombie(ゾンビ)」はカタカナで「ゾンビ」で分かりますかね。
「process(プロセス)」の意味は「過程」とか「経過」とか「方法」とか「手順」とか「工程」とか「処理」とか「処理する」とか「加工する」とかです。
何となく くっつけると
ゾンビになっている処理
となります。
■検索してみる?






