TL;DR
現在実行中のジョブを止めて、別のタスクに取りかかるよう CPU に通知する仕組み。割り込みコントローラと呼ばれるハードウェアが処理する。
なぜ必要か
Wikipedia によると、周辺機器は CPU よりずっと遅い。CPU が周辺機器の完了を定期的に確かめるポーリングでは、その確認のぶん他の処理の効率が落ちる。割り込みなら周辺機器の側から完了を知らせるので、CPU はその間ほかの作業を続けられる。
仕組み
割り込みを受けた CPU が取りかかるタスクでは、デバイスドライバや OS のスケジューラを呼び出す。
割り込みは、次のような理由で起きる。
- I/O デバイスが、ファイルやネットワークの読み込み、キーボードの打鍵といった操作を終えた
- 別のプログラムが割り込みを要求した
- ハードウェアクロックがクロック信号を出し、現在の実行を中断した。これにより、レディキューにある他のジョブも実行の機会を得られる
Wikipedia によると、割り込みは CPU の外からの信号で起きるハードウェア割り込みと、割り込み命令やゼロ除算などの例外で起きるソフトウェア割り込みに分けられる。割り込みが起きると、CPU は実行中の命令を中断し、戻り先のアドレスなどのコンテキストをスタックに退避する。次に割り込みベクタと呼ばれる表を引いて割り込みハンドラに移り、処理が終わると退避した情報を戻して元の処理を再開する。
注意点
割り込みが頻繁に起きると、退避と復帰のオーバーヘッドが積み重なる。その場合はポーリングの方が全体の性能が良いこともある。割り込みを処理する側と割り込まれる側が同じリソースを使う箇所では、排他制御が必要になる。