[ 通常表示 ]  [ 簡易表示 ]  [ シンプル表示 ]

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

ゾンビプロセス (zombie process)

pointこの用語のポイント

pointプロセスだよ

pointもう居ないのにまだ居ることになってるよ

スポンサーリンク

簡単に書くよ

ゾンビプロセス (zombie process)とは

もういないのに「まだいるよ状態」になっているプロセスのこと
です。

image piyo

詳しく書くよ

プロセスは「メモリを使って、なんかやっているプログラムひとつひとつ」ね。
プログラムは、動いていればメモリを使っています。
よく分からなければ「実行中のプログラム」と読み替えてください。

ゾンビプロセス

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

ゾンビプロセス2

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

ゾンビプロセス3

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

ゾンビプロセス4

それを踏まえて「もうお仕事は終わっているんだけど管理台帳にはまだ名前が残っているプロセス」が「ゾンビプロセス」です。
もういないのに、まだいることになっているプロセスですね。

それでは、順番に見ていきましょう。

ピヨ太ママは、高級会員制秘密クラブ「ライナックス」のメンバーです。

ゾンビプロセス5

ライナックスでは、入るときに台帳に名前を書きます。

ゾンビプロセス6

出るときに台帳から名前を消します。

ゾンビプロセス7

これがルールです。
こうしておくことによって、ライナックス側では、台帳を見れば誰が遊びに来ているのか把握することができます。
何人遊んでいるかも分かるので、いろいろと便利なのです。

このライナックスに、ある日、ピヨ太ママはピヨ太君を連れて遊びに来ました。

ゾンビプロセス8

ルールに従い、入口で、ピヨ太ママの名前とピヨ太君の名前を書きます。

ゾンビプロセス9

ひとしきり満喫したピヨ太ママとピヨ太君はお家に帰ります。
ここでピヨ太ママは、うっかりミスをしてしまいました。
自分の名前だけ消して、ピヨ太君の名前を消さないまま帰っちゃったのです。

ゾンビプロセス10

そうすると、どうなると思います?

そうです。
ピヨ太君は、もうライナックスの中には、いません。
ピヨ太ママと共に帰っちゃいました。
でも、台帳上は、まだピヨ太君はライナックスの中で遊んでいることになっているのです。

このお話におけるピヨ太君が、ゾンビプロセスです。
もういないのに、まだいることになっていますよね。

「ゾンビプロセス」という言葉はUNIX系(Linuxとか)の話で、よく出てきます。

UNIX系では、動いているプロセスを「プロセステーブル」と呼ばれる台帳に書いて管理しています。
プロセスが開始されるとプロセステーブルに記載され、終了するとプロセステーブルから消されるのです。

このプロセステーブル上にはまだ記載されている(生きていることになっている)けど、実際には処理が終了している(死んでいる)プロセスがゾンビプロセスです。
死んでいるのに生きているからゾンビなんでしょうね。

せっかくなので、もう少し専門的な説明も書いておきます。
ここから先は、ちょっとばっかし小難しい説明になります。
よく分からない人は適当に読み飛ばしてください。

まず親プロセス内でfork()を実行すると子プロセスが作成されます。
そしてこのとき、プロセステーブルに子プロセスの内容が記載されます。

ゾンビプロセス11

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

ゾンビプロセス12

そして親プロセスでwait()が実行されると、プロセステーブルから子プロセスの内容が消されます。

ゾンビプロセス13

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

おっと、あるプロセスで問題発生です。
親プロセスがwait()しないで終了してしまいました。

ゾンビプロセス14

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

ゾンビプロセス15

育児放棄ってやつでしょうか。
いずれの場合も、このままではプロセステーブルから子プロセスの名前を消せません。
親プロセスの名前は親プロセスの親プロセスがwait()すれば消えますが、子プロセスの名前は、お仕事が終了しているにもにもかかわらず、ずっと残り続けてしまいます。
wait()すべき親プロセスが既にいませんからね。

ゾンビプロセス16

一般的には、このような孤児になったプロセスを指して「ゾンビプロセス」と言います。
親プロセスの育児放棄により、お仕事が終わったのに後始末をしてもらえなかったプロセスです。

ちなみに孤児になったプロセスは長老に引き取られます。
他のすべてのプロセスのご先祖様である「initプロセス」に引き取られ、以降はinitプロセスの子として扱われるのです。
そしてinitプロセスがwait()を実行したときに、プロセステーブルから情報が消されます。

あっ、そうそう。

世の中には「孤児プロセス」という用語もあります。
こだわり派な人は「ゾンビプロセス」と「孤児プロセス」を区別しているようです。
区別している人は

ゾンビプロセス:処理が終了していてwait()待ちのプロセス
孤児プロセス:親プロセスに育児放棄された(親が先に終了しちゃった)プロセス


のような解釈らしいですが、個人的には気にしなくて良いと思っています。
この定義に従えば、既にwait()待ちの状態で親プロセスに育児放棄された子プロセスは、ゾンビプロセスであり孤児プロセスでもあるということになってしまいますからね。

そんな考えなので、私は「ゾンビプロセス」と「孤児プロセス」の使い分けはしません。
それに「ゾンビプロセス」って言っておけば、普通は通じます。

何となくの説明としては、そんなところでしょうか。

image piyo2

一言でまとめるよ

まぁ「ゾンビプロセス」って単語が出てきたら「もういないのに、まだいることになっているプロセスなんだな~」と、お考えください。

一番上に戻るよ
スポンサーリンク