子プロセス
From Wikipedia, the free encyclopedia
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番のプロセス(スワッパー)以外は他のプロセスが fork システムコールで生成したものである。fork を呼び出したプロセスが、それによって生成されたプロセスから見た親プロセスである。プロセスにはひとつの親プロセスがあるが、子プロセスは複数存在することもある。
カーネルは、プロセスをプロセス識別子 (PID)で識別する。0番のプロセスはシステムブート時に生成される特別なプロセスで、子プロセス(1番のプロセス)を生成した後はスワッパー・プロセスとなる(Solaris や SVR4.2MP ではマルチスレッド化され、カーネル内の各種定期処理をこなす)。1番のプロセスは init であり、システム内の他のプロセスの先祖になる。[3]
孤児プロセス
孤児プロセス[4]は、親プロセスが先に終了してしまったプロセスを意味する。
UNIX 系オペレーティングシステムでは、孤児プロセスは親プロセスが実行を終了した時点で、原則として init プロセスを里親とする。この操作をリペアレンティング[5](再育成)と呼び、自動的に行われる。この処理は、終了した親プロセスはそれがゾンビプロセスとなった場合も含め、もはや wait を呼び出して子プロセスの終了ステータスを回収できなくなることから必要となる。技術的には init プロセスが親となっても、本来の親プロセスが既に終了していることから「孤児プロセス」と呼ばれ続ける。
孤児プロセスの里親プロセスは通常は init プロセスとなるが、終了した親プロセスと init プロセスの間にサブリーパー[6]となっているプロセスが存在する場合、そのプロセスが里親となる。[7][8] この機能は主にコンテナをサポートする OS にて実装されている。コンテナを管理するプロセスがサブリーパーになることにより、コンテナ内にて終了したプロセスの終了ステータスがコンテナの外に飛び出すのを防止したり、異常終了したプロセスをコンテナ管理プロセスから再起動することができる。
上記とはやや異なる意味で、遠隔手続き呼出し (RPC) において、クライアントが要求をサーバに送った後でクラッシュしたとき、サーバ側に残ってしまったプロセスを孤児プロセスと呼ぶ。この孤児プロセスはサーバの資源を無駄に占め、場合によってはサーバ全体の不調の原因となる。この対処方法として以下のものがある。