コンテキスト切替え(コンテキストスイッチ)は、OSのタスク管理で欠かせない仕組みです。
プリエンプティブ方式やラウンドロビン方式を理解するうえで、この処理の正体を知っておくことが前提になります。
対象試験と出題頻度
コンテキスト切替えは、基本情報技術者・応用情報技術者で出題されるテーマです。
タスク管理の一部として、プリエンプティブ方式のオーバヘッドやタスク状態遷移との関係で問われます。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★☆☆☆
ランクC(応用)余裕があれば覚える
用語の定義
情報処理試験を勉強していると、「コンテキスト切替えって、ただのタスクの交代じゃないの?」と軽く流しがちです。
コンテキスト切替え(Context Switch)とは、一言で言うと
「実行中のタスクのレジスタ情報やプログラムカウンタの値を保存し、次に実行するタスクの情報を復元してCPUの使用権を切り替える処理」
のことです。
イメージとしては、「教室で先生が生徒を指名し直すときに、黒板の途中式をノートに書き写させ、次の生徒のノートを開く作業」です。
先生(OS)が生徒A(タスクA)の解きかけの式を「ノートに保存させ」、次に生徒B(タスクB)の前回の続きを「ノートから復元して」黒板に書く。
この保存→復元のセットがコンテキスト切替えに当たります。
📊 コンテキスト切替えの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Context Switch |
| 分類 | OSのタスク管理に属する処理 |
| 別名 | コンテキストスイッチ、タスク切替え |
| 保存・復元される情報 | プログラムカウンタ、汎用レジスタ、PSW(プログラムステータスワード)、主記憶のアドレス空間情報など |
解説
マルチタスク環境では、CPUは複数のタスクを高速に切り替えながら処理を進めます。
しかし、切り替えの瞬間に「今どこまで計算したか」を失ってしまったら、タスクを再開できません。
この「計算途中の状態」をまとめてコンテキスト(文脈)と呼びます。コンテキストには、プログラムカウンタの値、汎用レジスタの内容、PSW(演算結果のフラグや割込みマスク情報)などが含まれます。
コンテキスト切替えの流れ
OSがタスクを切り替えるとき、内部では次の3ステップが実行されます。
コンテキスト切替えの3ステップ
Step 1:現タスクのコンテキストを保存
実行中タスクのレジスタ値・プログラムカウンタ・PSWをTCB(タスク制御ブロック)に退避する
Step 2:次タスクのコンテキストを復元
次に実行するタスクのTCBからレジスタ値・プログラムカウンタ・PSWをCPUにロードする
Step 3:CPUの制御を次タスクに渡す
ディスパッチャが次タスクを実行状態に遷移させ、処理を再開する
※ TCB = Task Control Block(タスクごとの管理情報を格納するデータ構造)
図解:タスクAからタスクBへの切替え
タイムライン:タスクAからタスクBへの切替え
タスクA 実行中
CPUがタスクAの命令を処理
コンテキスト切替え
①Aの状態を保存
②Bの状態を復元
← オーバヘッド →
タスクB 実行中
CPUがタスクBの命令を処理
▲ 切替え区間はCPUが「本来のタスク処理」を行えないため、純粋なオーバヘッドとなる
オーバヘッドが問題になる場面
切替え処理そのものは数マイクロ秒程度ですが、切替え回数が増えると無視できない負荷になります。
プリエンプティブ方式はOSが強制的にタスクを切り替えるため、ノンプリエンプティブ方式よりも切替え頻度が高く、オーバヘッドも大きくなります。
ラウンドロビン方式でタイムクォンタム(1回のCPU割当て時間)を極端に短くすると、切替え回数が激増し、CPUが「タスクの処理」ではなく「切替え作業」に時間を費やす状態に陥ります。
プリエンプティブ方式とノンプリエンプティブ方式のオーバヘッド比較
| 比較項目 | プリエンプティブ | ノンプリエンプティブ |
|---|---|---|
| 切替えの主体 | OSが強制的に切替え | タスク自身が自発的に解放 |
| 切替え頻度 | 高い | 低い |
| オーバヘッド | 大きい | 小さい |
| 応答性 | 高い(即座に切替え可能) | 低い(タスク終了まで待つ) |
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 コンテキスト切替えの核心を3行で
・タスク切替え時に、現タスクのレジスタ値やプログラムカウンタをTCBに保存し、次タスクの情報を復元する処理
・プリエンプティブ方式はノンプリエンプティブ方式よりも切替え頻度が高く、オーバヘッドが大きい
・切替え区間はCPUが本来の処理を行えないため、頻度が増えるほどスループットが低下する
試験ではこう出る!
コンテキスト切替え単独で問われるケースは多くありませんが、プリエンプティブ方式やスケジューリングの問題の選択肢に「コンテキスト切替えのオーバヘッド」が登場します。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| AP H26春 午前 問16 |
プリエンプティブ方式に関する記述を選ぶ問題 | ・選択肢イに「ノンプリエンプティブ方式に比べてコンテキスト切替えのオーバヘッドが小さい」→不正解 ・正解はエ「OSがプロセスを強制的に切り替えて実行する機構が必要」 |
| AP R3春 午後 問8 |
情報システム開発に関する問題文中で、コンテキストスイッチの定義が登場 | ・「実行中のプロセスの状態を保存し、中断していたプロセスの状態を復元する処理」という定義が問題文で使われた |
| FE H30秋 午前 問18 |
ラウンドロビン方式の説明を選ぶ問題 | ・タイムクォンタム経過ごとにタスクを切り替える方式の理解が前提 ・切替えが頻繁になる点を理解していないと正解を選べない |
📝 IPA試験での出題パターン
パターン1:「プリエンプティブ方式の特徴を選べ」
選択肢に「コンテキスト切替えのオーバヘッドが小さい」という記述が紛れ込む。プリエンプティブ方式は切替え頻度が高いため、オーバヘッドはノンプリエンプティブ方式より大きい。ここを逆にした選択肢がひっかけの定番。
パターン2:「ラウンドロビン方式でタイムクォンタムを変えたらどうなるか」
タイムクォンタムを短くすると切替え回数が増えてオーバヘッドが増大する、という因果関係を問う形式。
ここだけは確実に押さえてください。「プリエンプティブ=切替え多い=オーバヘッド大」この1文が選択肢の正誤判定に直結します。試験ではここまででOKです。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. OSがタスクを切り替える際に行う「コンテキスト切替え」の説明として、最も適切なものはどれでしょうか?
- A. 主記憶上のページをディスクに退避し、必要なページをロードする処理である。
- B. 実行中タスクのレジスタやプログラムカウンタの値を保存し、次に実行するタスクの情報を復元してCPUの使用権を渡す処理である。
- C. 複数のCPUコアに対してタスクを均等に振り分け、負荷を分散する処理である。
正解と解説を見る
正解:B
解説:
コンテキスト切替えは、現在実行中のタスクのCPUレジスタやプログラムカウンタの値をTCBに保存し、次に実行するタスクの情報をTCBから復元してCPUに渡す一連の処理です。
選択肢Aはページング(仮想記憶管理)の説明です。主記憶とディスク間でページを入れ替える処理は記憶管理が担う機能であり、タスク状態の保存・復元とは別の仕組みです。選択肢Cはロードバランシング(負荷分散)の説明です。複数のCPUコアへのタスク配分はマルチプロセッサ環境での話であり、単一CPUでのタスク切替えとは異なります。
よくある質問(FAQ)
Q. コンテキスト切替えとディスパッチは何が違いますか?
ディスパッチは「実行可能状態のタスクにCPUの使用権を割り当てる」操作を指します。コンテキスト切替えは、そのディスパッチを行う際に必要となる「状態の保存と復元」の具体的な処理です。つまりディスパッチが「誰に渡すか」を決める判断で、コンテキスト切替えが「渡すために行う作業」に当たります。
Q. スレッドの切替えでもコンテキスト切替えは発生しますか?
発生します。ただし、同一プロセス内のスレッド同士はメモリ空間を共有しているため、アドレス空間の切替えが不要です。そのぶんプロセス間の切替えよりもオーバヘッドが小さくなります。軽量プロセス(Lightweight Process)と呼ばれるのはこの特性が理由です。
Q. コンテキスト切替えの時間を短くする方法はありますか?
ハードウェアレベルでは、レジスタセットを複数持つアーキテクチャ(レジスタウィンドウ方式)を採用することで、保存・復元の回数を減らす手法があります。ソフトウェアレベルでは、前述のとおりスレッドを活用してアドレス空間の切替えコストを回避する方法が一般的です。IPA試験の範囲ではここまで深掘りされないため、「プロセスよりスレッドのほうが切替えコストが小さい」という点を押さえておけば十分です。
Q. リアルタイムOSでもコンテキスト切替えは発生しますか?
発生します。リアルタイムOS(RTOS)では、優先度の高いタスクが発生した瞬間に即座に切替えが行われます。RTOSは切替えにかかる時間(レイテンシ)を保証する設計になっており、汎用OSよりも切替え時間が短く予測可能です。組込みシステムの制御(自動車のABSやロボットの動作制御など)で使われる理由はここにあります。