ゾンビプロセス という抽象、比喩

↓ の本を読んでいたところ、ゾンビプロセスに関して下記の様に記述されていました。

The Design and Implementation of the 4.3Bsd Unix Operating System

The Design and Implementation of the 4.3Bsd Unix Operating System

With all its resources free, the exiting process finishes its manipulation of its proc entry to detach the process from its process group, and notifies its parent of its completion. The process has now become a zomebie process -- one with no resources, not even a kernel stack.

『The Design and Implementation of the 4.3 Bsd Unix Operating System』P.145

ユーザ空間のプロセスから見た説明だと、 _exit(2) して 親プロセスの wait(2) 待ちの状態がゾンビプロセスな訳ですが、まぁ理屈は分かってるけど なんでそれがゾンビなんだろうね、という感覚なのでした。長い間。

で、カーネル側から見た場合には、 リソースもカーネル用スタックすらも割り当てられてないのに存在している... という状態な訳で、ようやくここで ゾンビ という語感がストンと腑に落ちた感じです。

え、分からんて? うーん

The Zombies

で、おもむろに 手元にあった各種カーネルのソースからゾンビっぽい記述を grep してみました。

  • Version 6th Unix ( v6bin/usr/sys/proc.h )
#define	SZOMB	5		/* intermediate state in process termination */
  • 4.3BSD (srcsys/h/proc.h)
#define	SZOMB	5		/* intermediate state in process termination */

生きてるのと死んでるのとの中間状態、というか死にかけ、というのは確かにゾンビ感の高い状態ですね。冒頭の奴よりこっちの表現の方がよいかな。

  • 4.4BSD Lite (usr/src/sys/sys/proc.h)
#define	SZOMB	5		/* Awaiting collection by parent. */
#define	SZOMB	5		/* Awaiting collection by parent. */

親プロセスの回収待ち、という説明しかない

#define TASK_ZOMBIE		3
#define EXIT_ZOMBIE		16

Linux は特に説明がついてませんでした。言わずもがな、という感じでしょうか

まとめ

ソフトウェアの構造や仕組みは様々な手法を用いて抽象化されていますが、抽象に用いる比喩とそれが連想させるものが説明したいものといい感じに一致している場合 納得感が高いなと思ったりしたのでした。

とはいえ比喩を濫用すると、比喩のイメージだけが先攻してしまい実際の構造/仕組みの理解をむしろ妨げているような事例もちょくちょく見るので、難しいものですね (OOPの説明に犬とか猫とかいらんだろ!!!1 とか DNSの浸透撲滅!!1 とか思ってる派

なんか話が大きくなってきたのでまた今度 ...

追記

ちょくちょく拝見している「Linuxの備忘録とか・・・」さんの wiki でもゾンビプロセスに関する章があって、こんなコメントが添えられていた

実際子プロセスのexitでタスク構造体以外の構造体情報等は無くなっているわけですから、実態のないプロセスと言うことで、今考えるにゾンビとは上手く言い当てているな〜。

ゾンビプロセスって?

この感じを説明したかったの!