前回の記事までの記事でプロセスはOSによって状態管理されていることを解説しました。しかし、実際にはどのような構造で管理されているかを今回の記事では解説したいと思います。
プロセス制御ブロック
プロセスは、OSシステム内部ではプロセス制御ブロック(PCB: Process Control Block)と呼ばれるデータ構造によって管理されます。または、プロセスコンテキストと呼ばれたりもします。
PCBの各項目は、プロセス管理モジュールだけでなく、OSを構成する種々のモジュールによって、参照・設定されます。PCBはプロセスを管理・制御するための情報とそのプロセスの実体へのポインタを情報として持ちます。ただし、PCB自体はプロセスのコードやデータを格納するものではなく、それらの情報を指し示す役割を担います。
プロセスの実体とは、プロセス領域とは、OSがプログラムの実行に割り当てるメモリ領域の構造を指し、スタック、ヒープ、テキスト、コードの4つの領域で構成されています。
PCBの項目には、以下のものがあります。以下は構成例ですので、OSによって異なる場合があります。
- 次のPCBへのポインタ
- プロセスの管理を効率化するために、次のPCBへのポインタが設定されます。これにより、プロセスのキューを形成し、スケジューリング時に迅速に参照できます。
- プロセス識別子(PID)
- 各プロセスには一意の識別番号が割り振られます。PIDはプロセスの識別や、プロセス間通信時に使用されます。
- プロセスの状態
- プロセスは主に「実行中」「実行可能」「待機中」などの状態を持ちます。状態の変化は、スケジューリングやI/O操作によって発生します。
- プロセスのスケジューリング情報
- 優先度、生成順、ライフタイム、CPU使用時間などが含まれます。これらの情報はスケジューラによって使用され、効率的にプロセスを管理します。
- プロセス領域へのポインタ
- 各プロセスが使用するメモリ領域(コード領域、データ領域、スタック領域、ヒープ領域)へのポインタです。これにより、必要に応じてメモリ領域を参照または解放できます。
- プログラムカウンタの退避領域
- プロセスが割り込みやコンテキストスイッチで中断される際、次に実行すべき命令を示すプログラムカウンタ(PC)の値を保存します。
- レジスタの退避領域
- 実行中のプロセスのレジスタ情報を保存します。これにより、プロセスが再開されたときに、元の状態を正確に復元できます。
- プロセス保護情報
- メモリの保護やアクセス制御に関する情報を含みます。特にマルチプロセス環境では、他のプロセスが不正にメモリにアクセスしないよう保護します。
- プロセッサ管理情報
- CPUの状態、ハードウェア機構の状態、タイマ情報などが含まれます。これらはプロセスの実行や割り込み処理に必要です。
- メモリ管理情報
- 子プロセスやスレッドに対するメモリ割り当て情報、仮想メモリのマッピング情報などを保持します。これにより、効率的なメモリ管理を実現します。
- ファイル管理情報
- プロセスが開いているファイルやディレクトリ、ファイル保護情報を保持します。ファイルディスクリプタやファイルポインタもここに格納されます。
- 入出力情報
- I/Oデバイスへのアクセス状況、入出力バッファ、割り込み処理に関する情報を含みます。I/Oの進行状態やエラーハンドリングにも活用されます。
- ユーザ情報
- プロセスを実行しているユーザの識別情報(UID)や権限、グループ情報などを含みます。
プログラムとしては構造体のようなもので、OSが管理するときに、そのプロセス情報をこのPCBに集約して管理するためのものになります。
OSはプロセスの実体ではなく、PCBの操作・処理によって間接的にプロセスを管理し制御します。PCBは実行時のハードウェアに関する情報を含み、割り込みの際に、レジスタやプログラムカウンタの情報を保存します。
割り込みのときのPCBへの退避と復帰
プロセスがスイッチするとき、実行中のプロセス関連情報がメインメモリ内に配置されているPCBへ退避されます。このプロセスが再度ディスパッチされ、実行状態に移行したとき、メインメモリに退避されていたPCBから情報を復帰し、実行されていた処理を途中から実行します。
このように、割り込み処理により現在実行中のプロセスの情報をPCBに退避させることにより、そのプロセスが今まで何をやっていたか、どんな状態だったのかをわかるので続きから処理を再開させることができます。

PCBの実装
単一のプロセッサを持つシステムの場合、実行状態のプロセスは一つですが、他の待ち状態、実行可能状態に関しては複数のプロセスが存在します。このため、PCBは実行可能状態用のキュー(待ち行列)、待ち状態用のキューがそれぞれ作成されます。さらに、実行可能状態は優先度あるいは到着順によって、先に実行されやすいなどが管理する必要があります。そのため、実行可能状態用のキューは優先度つきのキューで管理されます。
あるプロセスをプロセッサに割り当てる場合、実行可能キューの先頭のPCBに対応したプロセスが選択され割り当てられます。
一方で、待ち状態は特定のイベントの発生を待っている状態であり、優先度や到着順は関係なく、順序を意識する必要がない場合が多いです。

これらのキューは、一般的に線形リスト構造になっており、OSの管理領域に置かれます。各PCBは、キーにおける次のPCBへのポインタを持っている。プロセスは、実行されるまで徐々に実行可能キューの先頭へ移動していき、先頭に到達して、かつプロセッサが空いたとき、そのプロセスがプロセッサに割り当てられます。
まとめ
本記事では、PCBについて解説しました。PCBの構成例について示しました。また、PCBはコンテキストスイッチで、プロセスを切り替える際に重要な情報を保存していることを解説しました。
コメント