プロセス制御ブロック(Process Control Block, PCB)は、
オペレーティングシステム(OS)の
カーネル内で、各
プロセスの状態を管理するために用いられるデータ構造です。OSによっては、「
タスク」という用語が用いられ、
タスク制御ブロック(Task Control Block, TCB)と呼ばれる場合もありますが、基本的な機能はPCBと同様です。
PCBの概要
PCBには、
プロセスを識別するための情報や、
プロセスの実行状態に関する情報が格納されています。具体的な実装はOSによって異なりますが、一般的には以下のような情報が含まれます。
プロセス識別子 (PID): 各
プロセスを区別するためのユニークな番号です。
レジスタ群の値:
プロセスの実行中に使用されるレジスタの値が保存されます。特に、プログラムカウンタの値は、次に実行される命令のアドレスを保持しています。
アドレス空間:
プロセスが利用するメモリ領域を管理するための情報です。
オープンファイルとソケットのリスト:
プロセスが開いているファイルやネットワーク接続に関する情報です。
*
プロセスアカウンティング情報:
プロセスの実行時間や
CPU使用量など、
プロセスに関する統計情報です。
コンテキストスイッチとは、現在実行中の
プロセスを一時停止し、別の
プロセスに
CPUの実行権を移す操作です。この際、
カーネルは実行中の
プロセスのレジスタ値をPCBに保存し、次に実行する
プロセスのPCBからレジスタ値を復元します。これにより、
プロセスの中断と再開がスムーズに行われます。
カレントPCB
カーネル内のコードは、頻繁に現在実行中の
プロセスのPCB(カレントPCB)にアクセスします。通常、グローバルなポインタ変数を通じてアクセスしますが、性能向上のために固定の仮想アドレスにマッピングすることもあります。例えば、MIPSアーキテクチャでは、特定のアドレス(例えば、0xFFFFFFFF付近)にPCBをマッピングし、ゼロレジスタをポインタとして使用することで効率的なアクセスが可能です。
カーネル内では、
プロセスごとにスタックが用意されますが、ユーザ空間のスタックほど大きくできないため、
カーネルコードはスタックの使用量に注意する必要があります。また、再帰呼び出しも避けるべきです。
マルチプロセッシング環境では、各プロセッサが異なる
プロセスを実行するため、カレントPCBもプロセッサごとに存在します。
ユーザー
プロセスのマルチスレッドを
カーネルが認識して処理する場合(ライトウェイト
プロセス)、各スレッドは
カーネル内にコンテキストを持ちます。このため、PCBは
プロセス全体に関わる情報(
アドレス空間など)と、
コンテキストスイッチに関わる情報(レジスタ値など)に分けられ、後者はスレッドごとに作成されます。この構造は、
プロセス管理の2つの主要な機能(リソース管理と状態管理)に対応しています。