Show page source of 1.3 プロセス切り替え #15212

=== 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
上に読み込みます。