コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
コンテキストスイッチ
コンテキストスイッチ
このレッスンで分かること
- コンテキストスイッチとは、CPU が 実行中のプロセス/スレッドを保存し、別のものに切替える 動作です
- レジスタ・PC・スタックポインタ・メモリマップを退避し、次の対象のものを復元します
- スイッチ 1 回あたり 数 マイクロ秒のコストがあり、頻発するとシステム性能を蝕みます
コンテキストスイッチ とは
コンテキストスイッチ。本レッスンでは、コンテキストスイッチ の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
コンテキストとは
「コンテキスト(文脈)」は CPU が今この瞬間に持っている 実行状態 のことです。具体的には下記を指します。
| 項目 | 例 |
|---|---|
| 汎用レジスタ | rax, rbx, ... の値 |
| プログラムカウンタ (PC) | 次に実行する命令のアドレス |
| スタックポインタ (SP) | スタックの先頭位置 |
| プロセッサフラグ | キャリー、ゼロ、符号などのフラグ |
| メモリマップ | ページテーブルのトップ(CR3 レジスタ) |
| FPU / SIMD 状態 | 浮動小数点・ベクトル演算のレジスタ群 |
これらをまとめてカーネルが保存し、別のプロセスの分を復元することでスムーズな切替えが実現します。
スイッチの流れ
- タイマ割込み(数 ms 間隔)や I/O 完了でカーネルに制御が移る
- 現在の CPU 状態を PCB に退避
- スケジューラが次に走らせるプロセスを選ぶ
- 選ばれたプロセスの状態をレジスタへ復元
- 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 つができることを確認しましょう。
- コンテキストスイッチ の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. コンテキストスイッチ とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン