プロセスグループは、
POSIX準拠の
オペレーティングシステムにおいて、一つ以上の
プロセスの集合を指します。これらの
プロセスは、
プロセスグループIDという共通の識別子によって結び付けられます。このIDは、
プロセスグループのリーダーとなる
プロセスの
プロセスIDと同じ値が使用されます。
プロセスグループは、主に以下の二つの重要な役割を果たします。
1.
シグナルの配布: プロセスグループは、複数の
プロセスに対して一斉にシグナルを送信するために使用されます。`kill`
システムコールを通じて、特定の
プロセスだけでなく、
プロセスグループ全体にシグナルを送ることが可能です。これにより、グループ内の全
プロセスに対して同じ操作(例えば、中断や終了)を一度に行うことができます。
2.
ジョブコントロール: シェルプログラムは、
プロセスグループを使ってジョブコントロールを実現します。例えば、
端末からの割り込み(キーボード操作など)が発生した場合、`SIGTSTP`、`SIGQUIT`、`SIGINT`といったシグナルがフォアグラウンドの
プロセスグループに送られます。また、バックグラウンドの
プロセスグループが
端末からの入力を待っている場合は、`SIGTTIN`や`SIGTTOU`シグナルが送られます。
シェルは、コマンドパイプラインから
プロセスグループを生成し、どの
プロセスグループが
端末を制御するフォアグラウンドになるかを管理します。
プロセスグループのリーダー
プロセスグループは、常にリーダーとなる
プロセスによって開始されます。ただし、必ずしもリーダーが常に存在する必要はなく、リーダーが他の
プロセスよりも先に終了しても問題ありません。
POSIXの仕様では、
プロセスが偶然にグループリーダーになることはないと規定されており、
プロセスIDが
プロセスグループIDとして使用されている間は、同じIDが
プロセスIDとして再利用されることはありません。
プロセスグループの生成と操作
プロセスグループを生成または操作するには、`setpgid()`または`setsid()`
システムコールを使用します。
`setpgid()`システムコール: この
システムコールは、新たな
プロセスグループを生成したり、既存の
プロセスグループに
プロセスを追加したりするための汎用的な呼び出しです。
プロセスをグループリーダーにするには、`setpgid(0,0)`のように自身の
プロセスIDを指定して呼び出すことが一般的です。
シェルが子
プロセスをforkする際、親
プロセスと子
プロセスの両方が、その子
プロセスを
プロセスグループリーダーにしようと試みます。これは、子
プロセスがグループリーダーになろうとするタイミング、コマンドを実行しようとするタイミング、そして親
プロセスや
端末ドライバがジョブコントロールのシグナルを送ろうとするタイミングが競合するのを防ぐためです。
`setsid()`システムコール: この
システムコールは、新しいセッションを作成するために使用されます。セッションは、ログインセッションのようなテキストユーザインターフェースにおいて、
端末とのやり取りを管理する概念です。`setsid()`が成功すると、呼び出し元の
プロセスは新しいセッションのリーダーになると同時に、新しい
プロセスグループのリーダーにもなります。
プロセスグループはセッションをまたがることができないため、この
システムコールは新しいセッションと新しい
プロセスグループを同時に作成する目的で利用されます。ただし、既存の
プロセスが`setsid()`を実行することはできません。これは、既存の
プロセスが属する
プロセスグループが、セッションを移動することができないためです。そのため、
プロセスグループのリーダーが `setsid()` を実行しようとするとエラーが発生します。
プロセスグループとセッション
プロセスグループは、セッションという概念の一部として存在します。セッションは、テキストベースのUnixシステムで「ログインセッション」を意味していましたが、GUI環境ではその概念は重要性が低下しています。セッションリーダーと呼ばれる
プロセスが
端末と通信し、
端末が切断される際にセッション内の全
プロセスが停止することを保証します。セッションリーダーが存在しない場合、
端末のフォアグラウンドの
プロセスグループがセッション内の他の
プロセスグループの面倒を見ることになります。
プロセスは異なるセッションの
プロセスグループに移動することはできず、
プロセスグループも別のセッションに移動することはできません。
プロセスグループを生成する
プロセスは、自身が属するセッション内でのみ
プロセスグループを生成できます。
まとめ
プロセスグループは、
オペレーティングシステムにおける
プロセスの管理と制御において重要な役割を果たしています。特にシグナル処理やジョブコントロールにおいて、
プロセスをグループ化して管理することで、効率的で柔軟なシステムの運用を可能にします。
プロセスグループの概念を理解することは、
Unix系のシステムの仕組みを深く理解するために不可欠です。