TL;DR

複数のプロセスが 1 つの CPU を共有できるように、CPU の状態(コンテキスト)を保存・復元して、実行するプロセスを切り替えること。マルチタスクの OS に欠かせない機能である。

なぜ必要か

Wikipedia によると、プリエンプティブな OS では、プロセスはタイムスライスと呼ばれる短い時間ずつ実行される。プロセスが CPU を明け渡さなくても、タイマの割り込みで OS が別のプロセスに切り替えるので、計算ばかりするアプリケーションが CPU を占有しない。また、Go言語で学ぶ並行プログラミング 第2章 によると、スレッドの実行が I/O でブロックしたときも、OS が別のスレッドに切り替えるので、CPU サイクルは無駄にならない。

仕組み

Go言語で学ぶ並行プログラミング 第2章 によると、OS は後で中断したところから再開できるように、現在のプロセスの状態を保存し、次に実行するプロセスの状態を読み込む。この状態はプロセスコントロールブロック(PCB)に保持される。

切り替えは、タスク管理によるプロセスの切り替えのほか、割り込みハンドラの実行や、システムコールでユーザモードとカーネルモードを行き来するときにも起きる。

注意点

状態の保存と読み込みには多くの計算が必要なので、切り替えのたびにオーバーヘッドが発生する。Wikipedia によると、OS の設計ではこの最適化が重要な課題になる。

関連

出典