概要

コンテキストスイッチとは、1つの中央演算処理装置を複数の実行スレッドまたはプログラムで共有できるようにするため、必要な実行状態を保存し、あとで復元する操作である。保存された状態、つまりコンテキストには、レジスタ、プログラムカウンタ、そして実行をどこから再開するかを示すその他の情報が含まれる。コンテキストスイッチは、マルチタスクOSとカーネルの働きにとって基本的であり、CPUが競合する活動の間でどのように多重化されるかを左右する。オペレーティングシステムの設計では、コンテキストスイッチの遅延を減らすことがしばしば重視される。というのも、切り替えには単純な計算に比べて時間がかかるからである。

何が保存され、何が復元されるか

コンテキストスイッチで扱う状態の範囲は、プロセッサアーキテクチャとOSによって異なる。少なくとも通常は、汎用レジスタと命令ポインタが保存される。さらに、プロセス制御ブロックやスレッド制御ブロックといったタスク管理情報が、より高いレベルのメタデータを記録する。実際には、タスクのコンテキストスイッチ、スレッドのコンテキストスイッチ、プロセスのコンテキストスイッチを区別できる。スレッドの切り替えは、同じプロセス内のスレッドがアドレス空間や他の資源を共有するため、より軽量である。切り替え機構は、プラットフォームの能力に応じてソフトウェア、ハードウェア、あるいはその両方の組み合わせで実装される。

コンテキストスイッチが起こるとき

コンテキストスイッチは、ある実行主体から別の実行主体へ制御を移す必要があるたびに発生する。主な原因は次のとおりである。

  • スケジューラによるプリエンプション: 実行中のタスクが時間片を使い切り、スケジューラが別の候補を実行対象に選ぶ。
  • I/Oまたはブロッキング: プロセスがデバイス操作や資源の उपलब्धを待つ必要があり、CPUが別のタスクへ渡される。
  • 割り込み処理: 外部または内部の割り込みに即時対応する必要がある。アーキテクチャによっては、CPUが割り込みハンドラへ移行し、コンテキストが割り込みサービスルーチンへ切り替わる。いくつかのIntel x86設計のような典型的なデスクトップおよびサーバー向けCPUでは、割り込み駆動のプリエンプションが用いられる。
  • ユーザー/カーネル間の遷移: 特権が必要な処理のためにカーネルへ入る際、追加の状態を保存しなければならないことがある。OSによっては完全なコンテキストスイッチなしで実装できるが、場合によってはモード切り替えと同時にスイッチが起きる。

性能と最適化

コンテキストスイッチにはコストが伴う。レジスタの保存、キャッシュや変換ルックアサイドバッファ(TLB)のフラッシュまたは維持、スケジューラのデータ構造更新などが時間を消費するためである。不要なスイッチを減らすことは重要な最適化目標であり、過剰な切り替えは遅延を増やし、スループットを下げる。対策としては、I/Oのバッチ処理、効率的なスケジューリング方針の採用、よく使うデータをキャッシュに残すこと、そして完全なプロセス単位の切り替えを避ける軽量スレッドやコルーチン機構の利用などがある。ソフトウェア技法とプロセッサ機能の双方がオーバーヘッドに影響し、たとえばハードウェア支援によってレジスタの保存・復元を高速化したり、素早いコンテキストポインタを提供したりできる。

ハードウェア支援と歴史的発展

初期の設計では、コンテキストスイッチは完全にOSがソフトウェアで実装することが多かった。システムの発展に伴い、設計者はオーバーヘッドを減らすためにハードウェア機能を導入した。いくつかのプロセッサは、複数のレジスタセット、専用のコンテキスト保存命令、あるいは特権切り替えを高速化する仕組みを備える。別の設計では、作業の大部分をOSに任せつつ、割り込み処理を助けるトラップやベクタリングを提供する。ハードウェア支援とソフトウェア支援の配分は今も設計上の重要な選択であり、ハードウェアが少なすぎればカーネルの負担が増え、多すぎれば複雑さが増して移植性が下がる。

実用上の意味と例

アプリケーション開発者にとって、コンテキストスイッチは遅延に敏感なシステムと高スループット重視のシステムで異なる影響を持つ。リアルタイムシステムは、期限を守るために切り替え時間を一定範囲に収めようとする。一方、サーバーやデータベースは、スループットを最大化するためにスイッチ回数を減らそうとする。ユーザー空間スレッドやイベント駆動アーキテクチャのような軽量な並行処理手法は、可能な限りカーネルレベルのコンテキストスイッチを避ける。カーネル開発者は、公平性、応答性、CPU利用率のバランスを取るために、スケジューラと割り込み処理を調整する。スケジューリングの原則やOSの振る舞いについては、コンテキストオペレーティングシステム関連の資料、あるいは各種プロセッサマニュアルを参照するとよい。

区別と注目点

実行状態の変化がすべてコンテキストスイッチというわけではない。たとえば、ユーザーモードからカーネルモードへの単純な移行では、完全な実行コンテキストを保存する必要がない場合があるが、プロセス間の切り替えでは通常それが必要になる。何を切り替えるかの粒度、つまりレジスタ、メモリマップ、オープンファイル表などが、切り替えコストと実行再開の複雑さを決める。これらの違い、すなわちプロセスとスレッド、ハードウェア支援とソフトウェア支援、割り込み関連の切り替えとスケジューラ主導のプリエンプションを理解することは、マルチタスクシステムにおける性能と正しさを考えるうえで不可欠である。

さらに詳しい技術的内容やアーキテクチャ固有の挙動は、CPUおよびOSのマニュアルに記載されている。実装上の注記や例は、システムプログラミングのガイド、プロセッサのリファレンスマニュアル、カーネルソースツリーで確認できる。アーキテクチャ固有の機能については、Intelやx86に関するベンダー文書やコミュニティ資料、または設計の概説やソフトウェア工学の参考文献からたどれる一般的な解説を参照するとよい。