TL;DR
複数のプロセスが 1 つの CPU を共有できるように、CPU の状態(コンテキスト)を保存・復元して、実行するプロセスを切り替えること。マルチタスクの OS に欠かせない機能である。
なぜ必要か
Wikipedia によると、プリエンプティブな OS では、プロセスはタイムスライスと呼ばれる短い時間ずつ実行される。プロセスが CPU を明け渡さなくても、タイマの割り込みで OS が別のプロセスに切り替えるので、計算ばかりするアプリケーションが CPU を占有しない。また、Go言語で学ぶ並行プログラミング 第2章 によると、スレッドの実行が I/O でブロックしたときも、OS が別のスレッドに切り替えるので、CPU サイクルは無駄にならない。
仕組み
Go言語で学ぶ並行プログラミング 第2章 によると、OS は後で中断したところから再開できるように、現在のプロセスの状態を保存し、次に実行するプロセスの状態を読み込む。この状態はプロセスコントロールブロック(PCB)に保持される。
切り替えは、タスク管理によるプロセスの切り替えのほか、割り込みハンドラの実行や、システムコールでユーザモードとカーネルモードを行き来するときにも起きる。
注意点
状態の保存と読み込みには多くの計算が必要なので、切り替えのたびにオーバーヘッドが発生する。Wikipedia によると、OS の設計ではこの最適化が重要な課題になる。