割込み
進行中の処理を一時中断し、発生した事象に対応する処理へ制御を移す仕組み。復帰に必要な処理状態を退避し、対応が終わったら復元する。
イマシルちゃんの解説
本を読んでいる途中に、玄関の呼び鈴が鳴ったとするよ。
今のページにしおりを挟んでから、玄関へ向かうんだ。
用事が済んだら、しおりの場所に戻って続きを読めるよね。
どこまで読んだか忘れない準備が、切り替える前に必要なんだ。
より深い解説
発生するきっかけ
割込みを使うと、CPUが周辺機器の完了を絶えず確認し続けずに済む。機器から通知が来るまで、別の処理を進められる。
| 分類 | 例 |
|---|---|
| 外部からの通知 | 入出力完了、タイマーの通知 |
| 命令実行に伴う例外 | 0による除算、保護違反、ページフォールト |
| 明示的な制御移行 | OSの機能を呼び出す命令など |
例外やシステムコールを広い意味で内的割込みと整理する教材もある。CPUの仕様では、非同期に届く割込みと、命令に同期して起こる例外を区別することがある。
権限の切替え
ユーザモードは、一般のプログラムが動く権限を制限した状態である。特権モードは、OSが入出力制御などの特権命令を実行できる状態である。
アプリケーションが自由に割込み制御や保護設定を変更できると、ほかの処理まで停止させられてしまう。このため、必要な権限への移行は、CPUとOSが管理する入口を通して行う。
処理の基本的な順序
ユーザプログラムの実行中にOSが割込みを受け付ける場合、試験で扱う概念上の流れは次のようになる。
| 段階 | 処理 |
|---|---|
| 1 | 特権モードへ移る |
| 2 | プログラムカウンタや状態情報を退避する |
| 3 | 割込みの種類に対応する処理の開始番地を決める |
| 4 | 割込み処理ルーチンを実行する |
| 5 | 必要な状態を復元し、適切な処理へ戻る |
重要なのは、戻り先を失う前に保存することである。実際にどのレジスタをハードウェアが保存し、どこからOSが保存するかはCPUの仕様によって異なる。上の順序を、すべてのCPU内部で独立した命令として実行するという意味ではない。
行き先と復帰の情報
割込みベクタは、割込みの種類と対応する処理を結び付けるための情報である。番号を使って表を引く方式などにより、処理の行き先を特定する。
割込み処理ルーチンは、機器の状態確認や通知の解除などを行うプログラムである。割込みハンドラとも呼ばれる。長い処理をここで実行し続けると、ほかの処理の応答性を損なうため、必要な部分だけを実施して後続処理へ渡す設計が使われる。
プログラムカウンタは、実行位置を示す情報である。命令レジスタが保持する命令そのものとは役割が異なる。また、例外の種類によっては、元の命令を再実行したり、プログラムを終了させたりするため、必ず次の命令へ進むとは限らない。