プロセスグループ

プロセスグループとは



プロセスグループは、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系のシステムの仕組みを深く理解するために不可欠です。



もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。