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