子プロセスとは、コンピュータのプロセス管理に関わる用語で、ほかのプロセスから呼び出されたプロセスのことを言う。チャイルドプロセスとも言い、呼出元のプロセスのことを親プロセスあるいはペアレントプロセスと呼ぶ。

マルチタスクのオペレーティングシステムに関してはプロセス管理の記事に詳しく述べられている。

や でも子プロセスと呼ばれるものが実装されていた。本稿ではこれについても述べる。

MS-DOS の子プロセス のアプリケーションソフトウェアの中には、それ自身をメモリの中に読み込んだまま、他のアプリケーションを起動する機能を有しているものがあった。(主に MS-DOSのシェルである )

この場合、ペアレントプロセスとなる呼出元のアプリケーションはメモリ上に存在しているが実行は完全に停止している。子プロセスとして起動した は、起動時に読み込まれたシェルとしての とは別のメモリ空間に存在し、親プロセスへは EXIT コマンドで復帰することが出来た。主な用途としては、ワードプロセッサや表計算ソフトなどではフロッピーディスクのフォーマットを行うため、またテキストエディタなどでは前述のディスクフォーマットのためのほかに、アセンブラやコンパイラなどの起動に使用された。

のアプリケーションや外部コマンドもシェルとしての の子プロセスとみなすことが出来る。

系システム 子プロセス 子プロセスは、他のプロセス(親プロセス)によって生成されたプロセスである。

子プロセスは親プロセスから多くの属性(例えばオープン中ファイル)を継承する。 では、子プロセスは(forkを使って)親のコピーとして生成される。子プロセスはその後(execを使って)指定されたプログラムで自分自身をオーバーレイすることができる。

プロセスは多くの子プロセスを生成できるが、あるプロセスから見た親プロセスはひとつである。ただし、最初に生成されるプロセスには親がいない。 ではこの最初のプロセスが であり、カーネルがブート直後に起動し、システムシャットダウン時まで決して終了しない。

親プロセス 親プロセスは、1つ以上の子プロセスを生成したプロセスである。

では、0番のプロセス(スワッパー)以外は他のプロセスが fork システムコールで生成したものである。fork を呼び出したプロセスが、それによって生成されたプロセスから見た親プロセスである。プロセスにはひとつの親プロセスがあるが、子プロセスは複数存在することもある。

カーネルは、プロセスをプロセス識別子 (PID)で識別する。0番のプロセスはシステムブート時に生成される特別なプロセスで、子プロセス(1番のプロセス)を生成した後はスワッパー・プロセスとなる( や SVR4.2MP ではマルチスレッド化され、カーネル内の各種定期処理をこなす)。1番のプロセスは であり、システム内の他のプロセスの先祖になる。Linux の多くのディストリビューションにて採用されている のように、PIDが1のプロセスが ではない場合もある。以下、本文にて「 プロセス」という表記は、厳密には PID が1であるプロセスを指す。

孤児プロセス 孤児プロセスは、親プロセスが先に終了してしまったプロセスを意味する。

系オペレーティングシステムでは、孤児プロセスは親プロセスが実行を終了した時点で、原則として プロセスを里親とする。この操作をリペアレンティング(再育成)と呼び、自動的に行われる。この処理は、終了した親プロセスはそれがゾンビプロセスとなった場合も含め、もはや を呼び出して子プロセスの終了ステータスを回収できなくなることから必要となる。技術的には プロセスが親となっても、本来の親プロセスが既に終了していることから「孤児プロセス」と呼ばれ続ける。

孤児プロセスの里親プロセスは通常は プロセスとなるが、終了した親プロセスと プロセスの間にサブリーパーとなっているプロセスが存在する場合、そのプロセスが里親となる。 この機能は主にコンテナをサポートする OS にて実装されている。コンテナを管理するプロセスがサブリーパーになることにより、コンテナ内にて終了したプロセスの終了ステータスがコンテナの外に飛び出すのを防止したり、異常終了したプロセスをコンテナ管理プロセスから再起動することができる。

上記とはやや異なる意味で、遠隔手続き呼出し (RPC) において、クライアントが要求をサーバに送った後でクラッシュしたとき、サーバ側に残ってしまったプロセスを孤児プロセスと呼ぶ。この孤児プロセスはサーバの資源を無駄に占め、場合によってはサーバ全体の不調の原因となる。この対処方法として以下のものがある。

根絶が最も一般的な手法。この場合孤児プロセスは強制終了させられる。 再生はクライアントがリブートしたときにタイムスタンプをサーバに送信し、それを受けて孤児プロセスを終了する。 期限切れはタイマーを設定してその間に処理が完了しない場合に孤児プロセスを終了する。クライアントが応答しない以外の原因で処理が完了しないときは、タイマーを延長する。

脚注