バフンウニの嘆き。  Nageki Of Bahun-uni


和名 ゾンビプロセス
英名 zombie process
品詞 名詞
分野 電算
嘆きその49 ゾンビプロセス

あ、ここですね、
自分の名前の不当さを嘆く場所というのは。
それでは、さっそく嘆かせていただきます。
なお、当方の嘆きに関しては、
ほぼ日刊イトイ新聞宇宙部に所属する
佐藤ベイさんの監修を経ております。

さて、私、ゾンビプロセスと申します。
私はUNIXにおけるプロセスの
あるひとつの状態を指すといえます。

ご存じかと思いますが解説すると、
UNIXというのはOSの呼び名で、
もともとは1968年にアメリカのAT&T社で
開発されたものですが、
現在はそこから多くの派生OSが存在するため、
そういったUNIX的OSを総称して
UNIXと呼ぶ場合が多いようです。

そのUNIXからメモリ領域の割り当てを受けて
処理を実行するプログラムが
すなわちプロセスなのですが、
あるプロセスは必要に応じて
他のプロセスを起動することができまして
起動する側を親プロセス、
起動された側を子プロセスと呼ぶわけです。

で、プロセスというのはタスクとも呼ばれ、
情報処理においてプログラムの動作中の
インスタンスを意味し、述べたように
割り当てられた領域で処理を実行しますが、
通常はその実行完了をもって終了、
つまりterminatedな状態になり、
それをもって記憶領域なり、
ディスク資源なりから消去されるわけです。
わかりますよね?

ところがプログラムの実行完了となるか、
明示的に終了させられるかして
terminatedな状態になったプロセスが
処理を完了したにもかかわらず、
プロセス管理テーブルに残り、
使用していた全メモリとリソースが
開放されないような場合、
その状態をゾンビプロセスと呼ぶんです。

ゾンビプロセスですよ?
ちょっとひどい呼び名だと思いませんか?
しかもね、ゾンビプロセスを消去する
コマンドの名前がkillですからね!
なんだってそんなぶっそうな名前を!
そんでもってもっというと、
ゾンビをkillするのが親ですからね。
子がゾンビになって親がkillするんですよ!

というのは、通常、プロセスの終了は
SIGCHLDシグナルで親に知らされて、
親は、プログラムの適当な場所で
waitpidシステムコールを
WNOHANGオプションつきで呼び出す、
もしくは、シグナルハンドラで
SIGCHLDシグナルを捕らえてwaitを実行、
それかsignalあるいは
sigactionシステムコールで
SIGCHLDに対して
SIG_IGNシグナルハンドラを
設定するのが一般的なんですけど、
そういった処理を行わないと
子はゾンビとして残り続けるんです。
で、それを消去する場合は、
親プロセスにkillコマンドで
SIGCHLDシグナルを送るわけです、
これはね、あなたね、言ってみればね、
「ゾンビになった子どもを殺せ」っていう
非常にやりきれない命令なわけでね、
しかも、それでもゾンビが残るなら、
親ごと終了させるっていうんですから、
もう、やりきれない話ですよ。
ちなみにゾンビプロセスは
UNIXのpsコマンドのSTATカラムに
「Z」と表示されるんですけど‥‥あれ?

ねぇ、聞いてます?
私の嘆き、聞いてます?
あ、心のシャッター、
下ろしちゃってるでしょ?
「こりゃムリだ」って感じで
そうそうにあきらめちゃってるでしょ!
んもぅ、やんなっちゃうなぁ!
ちゃんと理解しようとしてくださいよ!
ほんとに嘆きたいのはそこですよ!
ねぇ、ちょっと、ちょっと!


(つぎなる嘆きへつづく)

前へ 次へ


2010-12-07-TUE