=== 1.3 プロセス切り替え 限られた数のCPUを、数多くのプロセスから同時に利用するため、プロセススケジューラは最も動作させるに ふさわしいプロセスにCPU実行権を与えようとします。最もふさわしいプロセスに実行権を与えるためには、も ともとそのCPU上で動作していたプロセスの実行を中断し、新しいプロセスの実行を開始することになります。 この処理のことを「プロセス切り替え」または、「プロセスディスパッチ」と呼びます。また、プロセス切り替え を行う機能を「プロセスディスパッチャ」と呼びます。 ところで、プロセスを切り替えるとは具体的にはどのような作業でしょうか? あるCPU上で動作しているプ ロセスAから、別のプロセスBに切り替えることを考えてみましょう(図1-2のA)。 [[Thumb(fig1-2.png, size=542x608, caption=図1-2 プロセス切り替え)]] プロセスAは、プロセスAのために用意されたプロセス空間上で走行しています。プロセスAで実行中のプロ グラムでは、変数の値はメモリもしくはレジスタ上に存在し、実行中の命令はプログラムカウンタレジスタ[[footnote(task_struct構造体)]] が指しています。プロセスAが利用中のスタックはスタックポインタが指しています。また、プロセスAのプロ セス空間そのものも、特殊レジスタによって管理されています。 つまり、これらレジスタ群をすべてプロセスB用のレジスタ値で書き直せば、その瞬間からプロセスBが動作 を始めることが理解できると思います(図1-2のB)。また、再度プロセスAの実行を再開できるようにするため には、プロセスB用のレジスタ値で書き直す前に、プロセスA用のレジスタ値を退避しておく必要があることも 分かると思います(図1-2のC)。 これらレジスタ群の値のことをコンテキスト[[footnote(正確にはレジスタ値だけでなく、プロセスを形作るものすべて。)]]と呼びます。実行待ち状態のプロセスは、これらコンテキス トをtask_struct構造体やカーネルスタックに退避しておき、実際に実行状態になると、そのコンテキストをCPU 上に読み込みます。