チャイルドプロセス
出典: フリー百科事典『ウィキペディア(Wikipedia)』
チャイルドプロセスとは、コンピュータのプロセス管理に関わる用語で、ほかのプロセスから呼び出されたプロセスのことを言う。子プロセスとも言い、呼出元のプロセスのことをペアレントプロセスあるいは親プロセスと呼ぶ。
マルチタスクOSに関してはプロセス管理のアーティクルに詳しく述べられている。
MS-DOS、PC-DOSでもチャイルドプロセスと呼ばれるものが実装されていた。本稿ではこれについても述べる。
目次 |
[編集] MS-DOS のチャイルドプロセス
MS-DOSのアプリケーションソフトの中には、それ自身をメモリの中にロードしたまま、他のアプリケーションを起動する機能を有しているものがあった。(主にMS-DOSのシェルであるCommand.com)
この場合、ペアレントプロセスとなる呼出元のアプリケーションはメモリ上に存在しているが実行は完全に停止している。チャイルドプロセスとして起動したCommand.comは、MS-DOS起動時に読み込まれたシェルとしてのCommand.comとは別のメモリ空間に存在し、ペアレントプロセスへはEXITコマンドで復帰することが出来た。主な用途としては、ワードプロセッサや表計算ソフトなどではフロッピーディスクのフォーマットを行うため、またテキストエディタなどででは前述のディスクフォーマットのためのほかに、アセンブラやコンパイラなどの起動の用に供された。
MS-DOSのアプリケーションや外部コマンドもシェルとしてのCommand.comのチャイルドプロセスとみなすことが出来る。
[編集] UNIX系システム
[編集] 子プロセス
子プロセスは、他のプロセス(親プロセス)によって生成されたプロセスである。
子プロセスは親プロセスから多くの属性(例えばオープン中ファイル)を継承する。UNIXでは、子プロセスは(forkを使って)親のコピーとして生成される。子プロセスはその後(execを使って)指定されたプログラムで自分自身をオーバーレイすることができる。
プロセスは多くの子プロセスを生成できるが、あるプロセスから見た親プロセスはひとつである。ただし、最初に生成されるプロセスには親がいない。UNIXではこの最初のプロセスが init であり、カーネルがブート直後に起動し、システムシャットダウン時まで決して終了しない。
[編集] 親プロセス
親プロセスは、1つ以上の子プロセスを生成したプロセスである。
UNIXでは、0番のプロセス(swapper)以外は他のプロセスが forkシステムコールで生成したものである。forkを呼び出したプロセスが、それによって生成されたプロセスから見た親プロセスである。プロセスにはひとつの親プロセスがあるが、子プロセスは多数存在することもある。
カーネルは、プロセスをプロセス識別子(PID)で識別する。0番のプロセスはシステムブート時に生成される特別なプロセスで、子プロセス(1番のプロセス)を生成した後は swapper プロセスとなる(SolarisやSVR4.2MPではマルチスレッド化(正確にはマルチLWP化)され、カーネル内の各種定期処理をこなす)。1番のプロセスは init であり、システム内の他のプロセスの先祖になる。
[編集] 孤児プロセス
孤児プロセス(Orphan Process)は、親プロセスが先に終了してしまったプロセスを意味する。
UNIX系オペレーティングシステムでは、孤児プロセスは即座に init プロセスを里親とされる。この操作を re-parenting(再育成)と呼び、自動的に行われる。技術的には init プロセスが親となっても、本来の親プロセスが既に終了していることから「孤児プロセス」と呼ばれ続ける。
RPCにおいて、クライアントが要求をサーバに送った後でクラッシュしたとき、サーバ側に残ってしまったプロセスを孤児プロセスと呼ぶ。この孤児プロセスはサーバの資源を無駄に占め、場合によってはサーバ全体の不調の原因となる。この対処方法として以下のものがある。
- 根絶(extermination)が最も一般的な手法。この場合孤児プロセスは強制終了させられる。
- 再生(reincarnation)はクライアントがリブートしたときにタイムスタンプをサーバに送信し、それを受けて孤児プロセスを終了する。
- 期限切れ(expiration)はタイマーを設定してその間に処理が完了しない場合に孤児プロセスを終了する。クライアントが応答しない以外の原因で処理が完了しないときは、タイマーを延長する。