コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

コンテキストスイッチ

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

コンテキストスイッチ

このレッスンで分かること

  • コンテキストスイッチとは、CPU が 実行中のプロセス/スレッドを保存し、別のものに切替える 動作です
  • レジスタ・PC・スタックポインタ・メモリマップを退避し、次の対象のものを復元します
  • スイッチ 1 回あたり 数 マイクロ秒のコストがあり、頻発するとシステム性能を蝕みます

コンテキストスイッチ とは

コンテキストスイッチ。本レッスンでは、コンテキストスイッチ の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

コンテキストとは

「コンテキスト(文脈)」は CPU が今この瞬間に持っている 実行状態 のことです。具体的には下記を指します。

項目
汎用レジスタrax, rbx, ... の値
プログラムカウンタ (PC)次に実行する命令のアドレス
スタックポインタ (SP)スタックの先頭位置
プロセッサフラグキャリー、ゼロ、符号などのフラグ
メモリマップページテーブルのトップ(CR3 レジスタ)
FPU / SIMD 状態浮動小数点・ベクトル演算のレジスタ群

これらをまとめてカーネルが保存し、別のプロセスの分を復元することでスムーズな切替えが実現します。

スイッチの流れ

diagram (will load when visible)
  1. タイマ割込み(数 ms 間隔)や I/O 完了でカーネルに制御が移る
  2. 現在の CPU 状態を PCB に退避
  3. スケジューラが次に走らせるプロセスを選ぶ
  4. 選ばれたプロセスの状態をレジスタへ復元
  5. PC が指す命令から実行再開

具体例

Linux ではコンテキストスイッチ回数を vmstat で観察できます。

ターミナル

vmstat 1 5

プレーンテキスト

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 2.5G 12M 800M 0 0 0 0 412 2351 3 1 96 0 0 0 0 0 2.5G 12M 800M 0 0 0 0 398 8420 5 3 91 0 0

-system-- グループの cs 列が 1 秒あたりのコンテキストスイッチ回数です。1000 以下なら平和、1 万を超えると詰まり始め、10 万を超えるとほぼ確実に問題があります。

スレッド切替え vs プロセス切替え

種類切替えるものTLB フラッシュ
同プロセス内スレッドレジスタ・SP・PC不要(メモリマップ共有)
別プロセスレジスタ + ページテーブル必要

別プロセスへ切替えると、TLB(Translation Lookaside Buffer) という仮想アドレス変換キャッシュを捨てる必要があり、その後しばらくメモリアクセスが遅くなります。これがプロセス切替えがスレッド切替えより重い理由です。

トレードオフ

  • スイッチ頻度を上げると 応答性 は上がりますが、スループットは下がります。タイムスライス(Linux なら数 ms)はこのバランスで決まっています
  • マルチコア環境では「同じコアに留めた方が L1/L2 キャッシュが温まったまま」になるため、CPU アフィニティ を設定して特定のスレッドをコアに固定する手法があります
  • セキュリティ対策の KPTI(カーネルページテーブル分離)導入で、コンテキストスイッチのコストが上昇しました

よくある誤解

  • 「コンテキストスイッチ = プロセスの切替えだけ」と思いがちですが、ユーザー → カーネル → ユーザー のシステムコール往復もモード切替えとしてコストを生みます
  • 「CPU が速ければスイッチは無視できる」は誤りで、キャッシュミスと TLB フラッシュの影響は CPU 速度では消えません

やってみよう

cat /proc/self/status | grep -E "voluntary|nonvoluntary" を実行すると、自分のプロセスが「自発的に手を引いた」回数と「強制的に切替えられた」回数が見られます。前者が多ければ I/O 待ち、後者が多ければ CPU 競合の傾向です。

よくある質問

Q. このトピックは実務でどう役立ちますか?

A. DB のクエリ最適化、API 設計、データ構造の選択など、設計判断の根拠になります。表面的にライブラリを使うだけでなく「なぜそれが速いのか」を理解できると、性能問題を未然に防げます。コーディング面接でも頻出のテーマです。

Q. 計算量はどう求めれば良いですか?

A. ループのネストごとに掛け算する、再帰なら漸化式から解く、というのが基本です。Big-O 表記は定数倍と低次の項を無視するため、n の指数(n²、n log n など)に注目してください。最悪・平均・最良の 3 つを意識すると説得力が増します。

Q. 覚えるべき定番アルゴリズムは何ですか?

A. 二分探索、クイックソート/マージソート、BFS/DFS、ダイクストラ、DP の基本問題(フィボナッチ・ナップサック)が必修です。これらを「白紙から書ける」状態にすると、応用問題が一気に解けるようになります。

次のレッスン

次は スケジューラとアルゴリズム で、コンテキストスイッチ を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. コンテキストスイッチ の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. コンテキストスイッチ とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン