1.3 プロセス切り替え

 限られた数のCPUを、数多くのプロセスから同時に利用するため、プロセススケジューラは最も動作させるにふさわしいプロセスにCPU実行権を与えようとします。最もふさわしいプロセスに実行権を与えるためには、もともとそのCPU上で動作していたプロセスの実行を中断し、新しいプロセスの実行を開始することになります。この処理のことを「プロセス切り替え」または、「プロセスディスパッチ」と呼びます。また、プロセス切り替えを行う機能を「プロセスディスパッチャ」と呼びます。

 ところで、プロセスを切り替えるとは具体的にはどのような作業でしょうか? あるCPU上で動作しているプロセスAから、別のプロセスBに切り替えることを考えてみましょう(図1-2のA)。

 プロセスAは、プロセスAのために用意されたプロセス空間上で走行しています。プロセスAで実行中のプログラムでは、変数の値はメモリもしくはレジスタ上に存在し、実行中の命令はプログラムカウンタレジスタ*1が指しています。プロセスAが利用中のスタックはスタックポインタが指しています。また、プロセスAのプロセス空間そのものも、特殊レジスタによって管理されています。

 つまり、これらレジスタ群をすべてプロセスB用のレジスタ値で書き直せば、その瞬間からプロセスBが動作を始めることが理解できると思います(図1-2のB)。また、再度プロセスAの実行を再開できるようにするためには、プロセスB用のレジスタ値で書き直す前に、プロセスA用のレジスタ値を退避しておく必要があることも分かると思います(図1-2のC)。

 これらレジスタ群の値のことをコンテキスト*2と呼びます。実行待ち状態のプロセスは、これらコンテキストをtask_struct構造体やカーネルスタックに退避しておき、実際に実行状態になると、そのコンテキストをCPU上に読み込みます。


  1. *1task_struct構造体
  2. *2正確にはレジスタ値だけでなく、プロセスを形作るものすべて。