コンテキストスイッチ
OSの機能として、実行中のプロセスを切り替える機能があります。これをプロセススイッチあるいはコンテキストスイッチと呼びます。
一般的にコンテキストスイッチは以下のように、割り込みを使って行われます。
- 実行中のプロセスAからプロセッサを横取りし、そのプロセスを一時中断する
- 割り込み処理を実行する(OS側の実行)
- 割り込み処理が終了したら、プロセスBにプロセッサを譲り、プロセスBの実行を開始する
コンテキストスイッチは、割り込み処理の実行、プロセススケジューリング、プロセスディスパッチャの3つの処理により実現されています。

ここで、割り込みは時分割制御によるタイマ割り込みあるいは、ユーザプログラムがハードウェア資源を使いたい場合などに利用するソフトウェア割り込みなどがある。このソフトウェア割り込みはOSに依頼する形で割り込みを発生させるので、SVC(Supervisor Call)と呼ばれています。
OS側では割り込み処理を行い、どのプロセスを割り当てるかのプロセススケジューリングを実行し、プロセスをディスパッチするという流れでOS側は実行されます。
ここで、割り込みがかかると必ず別プロセスにスイッチするわけではありません。下図のように、元のプロセスが実行されることもあります。

状態遷移とプロセススイッチの関係
プロセスは一般的に、以下の3つの状態を持ちます。
- 実行状態(Running)
- 実行可能状態(Ready)
- 待ち状態(Waiting / Blocked)
これらの状態遷移は、主に割り込みを契機として行われます。


横取り→ディスパッチ
- タイマ割り込みが発生
- 実行状態だったプロセスAは実行可能状態に遷移
- スケジューリングの結果、プロセスBが選択される
- プロセスBが 実行状態 に遷移
このように、実行中のプロセスを強制的に中断することを 横取り(プリエンプション) と呼びます。
事象の発生待ち→ディスパッチ
- 実行中のプロセスAがI/O要求などを発行
- プロセスAは待ち状態に遷移
- OSに制御が戻る(システムコールによる割り込み)
このとき発生する割り込みは、プロセス自身が実行を継続できなくなるために発生する割り込みであり、
一般にブロック割り込みと呼ばれます。
その後、
- 実行可能状態のプロセスからスケジューリング
- プロセスBがディスパッチされ、実行状態に遷移
多くの 内部割り込み(例外・システムコール) は、このブロック割り込みに該当します。
事象の発生→ディスパッチ
- I/O完了、ユーザ入力などの 事象が発生
- ハードウェア割り込みが発生
- 待ち状態のプロセスAが 実行可能状態 に遷移
この割り込みを ウェイクアップ割り込み と呼びます。
待ち状態では、ディスクI/O完了や入力待ちなどが多いため、
ウェイクアップ割り込みの多くは外部割り込みです。
このとき、
- 実行中プロセスを継続する場合
- 横取りを行い、別プロセスに切り替える場合
のいずれもあり得ます。
切り替える場合は、再び スケジューリング → ディスパッチ が行われます。
まとめ
本記事では、コンテキストスイッチ(プロセススイッチ)について解説しました。
- コンテキストスイッチは 割り込みを契機 に行われる
- 割り込み処理・スケジューリング・ディスパッチの3段階で構成される
- 割り込みが発生しても、必ずしもプロセスが切り替わるとは限らない
- プロセスの状態遷移(実行/実行可能/待ち)と密接に関係している
コンテキストスイッチは、マルチタスクOSを理解する上で非常に重要な概念です。

コメント