「ジョブ」と「プロセス」の違いは何ですか?
プロセスは、独自のアドレス空間を持つ実行中のプログラムです。
ジョブはシェルで使用される概念です。対話的に開始する、切り離さない(つまり、デーモンではない)プログラムはすべてジョブです。インタラクティブなプログラムを実行している場合は、 CtrlZ 一時停止します。その後、フォアグラウンド(fg
を使用)またはバックグラウンド(bg
を使用)で開始できます。
プログラムが中断またはバックグラウンドで実行されている間、別のプログラムを開始できます。これにより、2つのジョブが実行されます。次のように「&」を追加して、バックグラウンドで実行されているプログラムを開始することもできます:program &
。そのプログラムはバックグラウンドジョブになります。実行中のすべてのジョブを一覧表示するには、jobs
を使用できます。
ジョブの詳細については、bashのmanページの このセクション を参照してください。
UNIXには、「プロセス」、「プロセスグループ」、および「セッション」という別々の概念があります。
ログイン時に取得する各シェルは、独自の新しいセッションとプロセスグループのリーダーになり、端末の制御プロセスグループをそれ自体に設定します。
シェルは、起動する各「ジョブ」の現在のセッション内にプロセスグループを作成し、開始する各プロセスを適切なプロセスグループに配置します。例えば、 ls | head
は、シェルが単一のジョブと見なし、単一の新しいプロセスグループに属する2つのプロセスのパイプラインです。
プロセスは、実行のスレッド(の集合)と、アドレス空間やファイル記述子テーブルなどの他のコンテキストです。プロセスは他のプロセスを開始できます。これらの新しいプロセスは、他のアクションが実行されない限り、親と同じプロセスグループに属します。各プロセスには、親と同じように開始する「制御端末」もある場合があります。
シェルには、「フォアグラウンド」ジョブと「バックグラウンド」ジョブの概念があります。フォアグラウンドジョブは端末を制御するプロセスグループであり、バックグラウンドジョブは端末を制御しないプロセスグループです。
各端末にはフォアグラウンドプロセスグループがあります。ジョブをフォアグラウンドに持ってくると、シェルはそれをターミナルのフォアグラウンドプロセスグループとして設定します。ジョブをバックグラウンドに配置すると、シェルはターミナルのフォアグラウンドプロセスグループを別のプロセスグループまたはそれ自体に設定します。
プロセスは、フォアグラウンドプロセスグループに属している場合、制御端末からの読み取りと制御端末への書き込みを行うことができます。それ以外の場合、端末からの読み取りおよび端末への書き込みの試行時に、それぞれSIGTTIN
およびSIGTTOU
信号を受け取ります。デフォルトでは、これらのシグナルはプロセスを中断しますが、ほとんどのシェルはSIGTTOU
をマスクするため、バックグラウンドジョブは中断されずに端末に書き込むことができます。