割り込みとは、プログラムが想定している以外のことが起こったために、マイクロプロセッサが指示されていないことを行うことです。割り込みは、プロセッサがハードウェアから信号を受け取ることで発生することがほとんどですが、プログラムと共に動作しているソフトウェアから発生することもあります。キーボードのキーを押したとき、内蔵タイマーが作動したとき、データ転送が行われたとき、その他プロセッサがすぐにアクションを起こす必要のあるイベントなどが、割り込みを引き起こす原因となることがあります。割り込みは、プロセッサがプログラムを実行している間、プログラムのソースコードのどこにあっても、いつでも発生する可能性があります。

割り込みの基本的な仕組み

  • 外部機器や内部回路が発する信号をプロセッサが受け取ることで割り込みが発生します。
  • 割り込みが発生すると、プロセッサは現在の実行状態(レジスタやプログラムカウンタなど)を保存し、あらかじめ定められた割り込みハンドラ(ISR: Interrupt Service Routine)へ制御を移します。
  • ハンドラは割り込みの原因を処理し、処理が終わると保存しておいた状態を復帰して中断前のプログラム実行を再開します。
  • 割り込み制御はプロセッサ内蔵の割り込みコントローラや外部のPIC/APICなどで管理され、優先度やマスク(無効化)を設定できます。

ハードウェア割り込みとソフトウェア割り込み(例)

  • ハードウェア割り込み:キーボード入力、タイマー割り込み、ネットワークカードやディスクコントローラからのI/O完了、DMA転送完了など。物理的なイベントに反応します。
  • ソフトウェア割り込み:プログラムが意図的に発行する割り込み(例:システムコールを実装するためのソフトウェア割り込み命令)。デバッグ用や例外発生時にも用いられます。
  • 例外(トラップ):ゼロ除算やページフォルト、命令不正など、命令実行の結果として発生する内部的な割り込み。通常はプロセッサによって例外として扱われます。
  • NMI(Non-Maskable Interrupt):マスクできない高優先度の割り込み。ハードウェア障害や重要な監視イベントに使われます。

割り込み処理の典型的な流れ

  • 割り込み要因が発生 → プロセッサに割り込み信号が送られる
  • 割り込み受理(優先度判定・マスク判定) → 受理されれば現在の実行状態を保存
  • 割り込みベクタに基づき対応するISRへジャンプ
  • ISRが割り込み原因を処理(必要に応じてフラグを設定、デバイスに応答)
  • 割り込みフラグのクリアやデバイスへの応答完了を確認
  • 保存しておいた状態を復帰して通常処理に戻る(復帰命令でIRETなど)

優先度・ネスト・マスク

  • 複数の割り込みが同時に発生した場合は優先度に従って処理されます。優先度はハードウェアまたはOSで管理されます。
  • 割り込みのネスト(ISR中にさらに割り込みを許す)を使うと高優先度の割り込みを即座に処理できますが、スタック使用量やレイテンシ管理に注意が必要です。
  • マスク可能割り込みは一時的に無効化でき、非マスク割り込み(NMI)は無効化できません。OSやドライバは重要なクリティカルセクションで割り込みを禁止することがあります。

設計上の注意点(実装とパフォーマンス)

  • ISRは可能な限り短くするのが原則。時間のかかる処理はデファードワーク(ソフトIRQ、タスクレット、ワーカースレッド等)に渡すべきです。
  • ISRとメインコードで共有するデータは競合状態になりやすいため、原子的操作やロック、volatile指定、メモリバリアなどで整合性を保つ必要があります。
  • 割り込みのレイテンシ(割り込み発生からISR開始までの遅延)や処理時間はリアルタイム性に影響します。リアルタイムOSや専用ハードウェアではこれらを厳密に管理します。
  • 無限ループや長時間ブロッキングをISR内で行うと、他の割り込みや通常処理が阻害されるため避けるべきです。

よくある例

  • キーボード:キー押下で割り込みが発生 → キースキャン・バッファ格納 → 後段で文字処理
  • タイマー:定期的にタイマ割り込み → タスクスケジューリングや統計計測を実行
  • ディスクI/O:読み書き完了で割り込み → 完了通知・バッファの後処理
  • ネットワーク:受信パケット到着で割り込み → パケット受信処理と上位プロトコルへの受け渡し

まとめると、割り込みはプロセッサが外部・内部のイベントに即応するための基本的なメカニズムです。適切な優先度管理、短いISR設計、共有リソースの保護を行うことで、効率的かつ安全に割り込みを利用できます。