回答:
プロセスは、独自のアドレス空間を持つ実行中のプログラムです。
ジョブとは、シェルで使用される概念です-対話的に起動しないプログラム(つまり、デーモンではない)はジョブです。対話型プログラムを実行している場合は、を押しCtrlZて中断できます。その後、フォアグラウンド(を使用fg
)またはバックグラウンド(を使用bg
)で開始できます。
プログラムが一時停止またはバックグラウンドで実行されている間に、別のプログラムを開始できます。2つのジョブが実行されます。次のように「&」を追加して、バックグラウンドで実行中のプログラムを開始することもできますprogram &
。そのプログラムはバックグラウンドジョブになります。実行中のすべてのジョブをリストするには、を使用できますjobs
。
ls | sort
はジョブですが、各コマンドは異なるサブシェルプロセスの子プロセスとして実行されます。これは、複数のプロセスで構成されるジョブの例です。ジョブを複数のプロセスで構成できることを、ジョブの定義でどのように説明できますか?
UNIXには、「プロセス」、「プロセスグループ」、および「セッション」という概念があります。
ログイン時に取得した各シェルは、独自の新しいセッションおよびプロセスグループのリーダーになり、端末の制御プロセスグループをそれ自体に設定します。
シェルは、起動する「ジョブ」ごとに現在のセッション内にプロセスグループを作成し、起動する各プロセスを適切なプロセスグループに配置します。たとえばls | head
、シェルは単一のジョブと見なし、単一の新しいプロセスグループに属する2つのプロセスのパイプラインです。
プロセスとは、実行のスレッド(コレクション)と、アドレス空間やファイル記述子テーブルなどの他のコンテキストです。プロセスは他のプロセスを開始する場合があります。これらの新しいプロセスは、他のアクションが実行されない限り、親と同じプロセスグループに属します。各プロセスには「制御端末」があり、親と同じように起動します。
シェルには、「フォアグラウンド」ジョブと「バックグラウンド」ジョブの概念があります。フォアグラウンドジョブは端末を制御するプロセスグループであり、バックグラウンドジョブは端末を制御しないプロセスグループです。
各端末にはフォアグラウンドプロセスグループがあります。ジョブをフォアグラウンドに持ってくると、シェルはそれを端末のフォアグラウンドプロセスグループとして設定します。ジョブをバックグラウンドに置くと、シェルは端末のフォアグラウンドプロセスグループを別のプロセスグループまたはそれ自体に設定します。
プロセスは、フォアグラウンドプロセスグループに属している場合、制御端末から読み取りおよび書き込みを行います。それ以外の場合は、端末からの読み取りおよび書き込みの試行をそれぞれ受信SIGTTIN
およびSIGTTOU
通知します。デフォルトでは、これらのシグナルはプロセスを一時停止しますが、ほとんどのシェルSIGTTOU
はバックグラウンドジョブが中断されることなく端末に書き込むことができるようにマスクします。
上記の定義は非常に技術的なものですが、運用担当者は日々の明確化を望んでいました。ジョブはスケジュールされたプロセスだと思います。一般にプロセスを扱うとき、スケジュールという概念は必ずしもありませんが、「ジョブ」という言葉を使用するときは、常にスケジュールされているか、ループのように繰り返し実行されることを意味します。