ホームページ >運用・保守 >Linuxの運用と保守 >親プロセスと子プロセスとは何ですか

親プロセスと子プロセスとは何ですか

PHP中文网
PHP中文网オリジナル
2017-06-22 15:41:218388ブラウズ

親プロセス

コンピュータ分野において、親プロセス(英語: Parent Process)とは、1つ以上の子プロセスを作成したプロセスを指します。

UNIX


UNIXでは、process 0(つまり、PID=0のスワッププロセス、Swapper Process)を除くすべてのプロセスは、システムコールforkを使用して他のプロセスによって作成されます。ここでは、フォークを呼び出して新しいプロセスを作成するプロセスが親プロセスであり、そのプロセスに対して作成された対応するプロセスが子プロセスになります。したがって、プロセス 0 を除くすべてのプロセスには親プロセスが 1 つだけありますが、プロセスには複数の子プロセスがあります。プロセス。

オペレーティング システム カーネルは、プロセス識別子 (プロセス識別子、PID) を使用してプロセスを識別します。プロセス 0 は、システムの起動時に作成される特別なプロセスです。fork を呼び出して子プロセス (つまり、PID=1 のプロセス 1、init とも呼ばれます) を作成した後、プロセス 0 はスワップ プロセス ( アイドル プロセスとも呼ばれます) になります。 )、プロセス 1 (初期プロセス) はシステム内の他のすべてのプロセスの祖先です。

ゾンビプロセスと孤立プロセス


子プロセスが実行を終了すると(通常はexitの呼び出し、実行時に致命的なエラーが発生、または終了シグナルの受信によって発生します)、子プロセスの終了ステータス(戻り値)が返されます。子プロセスはオペレーティング システムに報告され、システムは SIGCHLD シグナルを使用して子プロセスの終了を親プロセスに通知します。この時点では、子プロセスのプロセス制御ブロック (PCB) はまだ存在します。記憶の中で。一般に、SIGCHLD を受信した後、親プロセスは wait システム コールを使用して子プロセスの終了ステータスを取得し、親プロセスがこれを行わない場合、カーネルは終了した子プロセスの PCB をメモリから解放します。 、子プロセスは、プロセスの PCB が常にメモリ内に存在することになります。これは、子プロセスがゾンビ プロセスになることを意味します。

孤立プロセスとは、親プロセスが終了した後も実行中の子プロセスを指します。 UNIX のようなシステムでは、孤立プロセスは通常、init プロセスによって「採用」され、init の子プロセスになります。

実際のアプリケーションで一般的に採用されている方法は次のとおりです:

  1. 親プロセスのSIGCHLDシグナル処理関数をSIG_IGNに設定します(シグナルを無視します)

  2. forkを2回実行し、1つをkillします。第 1 レベルの子プロセスは第 2 レベルの子プロセスを孤立プロセスにし、init によって「採用」されてクリーンアップされます。

Linux

Linuxカーネルでは、プロセスとPOSIXスレッドの間には非常にわずかな違いがあり、親プロセスの定義もUNIXとは異なります。 Linux には、(正式な) 親プロセスと実親プロセスの 2 種類の親プロセスがあります。子プロセスの場合、子プロセスの終了時に SIGCHLD シグナルを受け取るプロセスが親プロセスであり、子プロセスが終了するプロセスが実親プロセスです。子プロセスが終了すると、スレッド環境で実際に子プロセスを作成するプロセスが SIGCHLD シグナルを受け取ります。通常のプロセスの場合、親プロセスと実際の親プロセスは同じプロセスですが、プロセスとして存在するPOSIXスレッドの場合、親プロセスと実際の親プロセスは異なる場合があります。

子プロセス


コンピュータの分野では、子プロセスとは、別のプロセス(相応して親プロセスと呼ばれます)によって作成されたプロセスです。子プロセスは、ファイル記述子など、親プロセスの属性のほとんどを継承します。


を生成します。 Unixでは、子プロセスは通常、システムコールforkの結果です。この場合、子プロセスは最初は親プロセスのコピーですが、その後、特定のニーズに応じて、子プロセスは fork的产物。在此情况下,子进程一开始就是父进程的副本,而在这之后,根据具体需要,子进程可以借助exec调用来链式加载另一程序。

与父进程的关系


一个进程可能下属多个子进程,但最多只能有1个父进程,而若某一进程没有父进程,则可知该进程很可能由内核直接生成。在Unix与类Unix系统中,进程ID为1的进程(即init进程)是在系统引导阶段由内核直接创建的,且不会在系统运行过程中终止执行(可参见Linux启动流程);而对于其他无父进程的进程,则可能是为在用户空间完成各种后台任务而执行的。

当某一子进程结束、中断或恢复执行时,内核会发送SIGCHLD信号予其父进程。在默认情况下,父进程会以SIG_IGN函数忽略之。

“孤儿进程”与“僵尸进程”


在对应的父进程结束执行后,进程就会变成孤儿进程,但之后会立即由init进程“收养”为其子进程。

某一子进程终止执行后,若其父进程未提前调用wait,则内核会持续保留子进程的退出状态等信息,以使父进程可以waitexec を使用して別のプロセスをチェーンロードできます。 .プログラム。

🎜🎜🎜🎜🎜親プロセスとの関係🎜🎜🎜🎜 プロセスは複数の子プロセスを持つことができますが、親プロセスを持たないプロセスは、最大で 1 つの親プロセスしか持てません。カーネルによって直接制御される可能性があります。 Unix および Unix 系システムでは、プロセス ID 1 のプロセス (つまり、init プロセス) はシステムの起動フェーズ中にカーネルによって直接作成され、システムの実行中に実行は終了しません (🎜Linux 起動プロセスを参照)。親プロセスを持たないプロセスは、ユーザー空間でさまざまなバックグラウンド タスクを完了するために実行される可能性があります。 🎜🎜🎜子プロセスが終了するか、中断されるか、実行を再開すると、カーネルは親プロセスに SIGCHLD シグナルを送信します。デフォルトでは、親プロセスは SIG_IGN 関数を使用してこれを無視します。 🎜🎜🎜「孤立プロセス」と「ゾンビプロセス」🎜🎜🎜🎜 対応する親プロセスが実行を終了すると、そのプロセスは孤立プロセスになりますが、すぐに init プロセスによってその子プロセスとして「採用」されます。 🎜🎜子プロセスが実行を終了した後、親プロセスが事前に wait を呼び出さなかった場合、カーネルは子プロセスの終了ステータスとその他の情報を保持し続けるため、親プロセスはwait を実行できます。 code>待って code>取得します。この場合、子プロセスは終了しているにもかかわらず、依然としてシステム リソースを消費しているため、ゾンビ プロセスとも呼ばれます。 🎜wait🎜 SIGCHLD 信号処理関数でよく呼び出されます。 🎜

解決策と予防

POSIX.1-2001 標準では、親プロセスは SIGCHLD 処理関数を SIG_IGN (これもデフォルト設定) に設定するか、カーネルが自動的に再利用できるように SIGCHLD の SA_NOCLDWAIT フラグを設定できます。終了した子プロセスのリソース。 Linux 2.6 と FreeBSD 5.0 以降、両方のカーネルがこれら 2 つの方法をサポートしています。ただし、System V と BSD の間には長年の違いがあるため、SIGCHLD シグナルを無視する場合には、派生子プロセスのリソースをリサイクルするには wait を呼び出すことが依然として最も便利な方法です。

以上が親プロセスと子プロセスとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。