割り込みとポーリングの違い:仕組みと使い分けを比較

デバイスが対応を求めていることを、プロセッサが知る方法は2つあります。ポーリングでは、CPUがループの中でデバイスの状態を何度も確認します。割り込みでは、デバイスがCPUへ信号を送り、CPUは、していた作業を止めて小さなハンドラを実行し、そのあと元に戻ります。ポーリングは、単純で予測しやすい反面、時間を無駄にします。割り込みは、効率がよく応答も速い反面、負荷が加わり、プログラムの動きを考えにくくなります。

項目ポーリング割り込み
仕組みCPUがステータスレジスタを繰り返し読み、デバイスの準備ができたかを確認するデバイスが信号を出し、CPUは作業を中断して、割り込みハンドラ(ISR)を実行する
待っている間のCPUビジー。確認のためにサイクルを使う空いている。ほかの仕事をしたり、スリープしたりできる
応答時間ループの確認の間隔で決まる。予測しやすい速い(マイクロ秒)。ただし、マスク、優先度、コンテキストの保存で変わる
オーバーヘッド何も起きなくても一定イベントごとにコストがかかる。イベントが非常に多いと、CPUが追いつかなくなる(割り込みストーム)
複雑さ書きやすく、デバッグしやすい複雑。ハンドラは短くする必要があり、メインのコードとの共有データには注意が要る(volatile、アトミックなアクセス)
消費電力CPUを起こしたままにするイベントで起こされるまで、低消費電力でスリープできる
タイミングの考えやすさ考えやすいハンドラとメインのコードの間で、並行処理のバグが起こりうる
主な用途非常に速い、または連続するイベント、単純なプログラム、高速なネットワークのドライバタイマー、ボタン、通信のイベント、センサーの警告、スリープからの復帰

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

ポーリング
イベントが頻繁なとき、またはループが単純で、ハンドラの複雑さなしに、予測可能なタイミングが欲しいとき。
割り込み
イベントがまれだったり予測できなかったりして、速い応答と低消費電力が欲しく、CPUにほかの仕事があるとき。
併用
組み合わせるシステムもあります。最初のイベントを割り込みで知らせ、通信が多い間は、ドライバがポーリングします。高速なネットワークのドライバなどです。

よくある質問

割り込みとポーリングでは、どちらが良いですか?

常にどちらがよいとは言えません。割り込みは応答が速く、CPUをスリープさせられ、ポーリングは単純で予測しやすいです。まれなイベントには割り込み、非常に頻繁なイベントにはポーリングを使います。

割り込みハンドラは何をするべきですか?

短くすることです。最小限の処理をして、フラグを立てるか処理を待ち行列に入れて戻ります。ハンドラ内の長い処理や、待ちの発生する呼び出しは、応答性を損ないます。

割り込みストームとは何ですか?

イベントが非常に速く来るので、CPUがハンドラの出入りだけに時間を使い切ってしまう状態です。高速なネットワークのドライバは、この場合、ポーリングに切り替えます。

なぜ割り込みは消費電力を節約できますか?

CPUは、絶えず起きて確認する代わりに、イベントで起こされるまでスリープできるからです。

理解度チェック

周辺回路の状態を知る方法のうち、ポーリングと割り込みの違いとして正しいものはどれか。

  1. AポーリングはCPUが状態を繰り返し調べに行き、割り込みは状態が変わったときに周辺回路からCPUに知らせる
  2. Bポーリングと割り込みは同じものである
  3. C割り込みはCPUが状態を繰り返し調べに行く方式である
答えと解説を見る

正解:A. ポーリングはCPUが状態を繰り返し調べに行き、割り込みは状態が変わったときに周辺回路からCPUに知らせる

ポーリングは仕組みが単純で、調べる間隔が決まっているので動きを予測しやすい一方、何も起きていなくてもCPUが調べ続けるので時間と電力をむだにします。割り込みは変化があったときだけCPUが応えるので、待っている間に別の処理をしたり眠ったりできます。ただし割り込みが非常に頻繁だと、かえって処理の手間が大きくなるので、使い分けが大切です。

割り込みハンドラの中で避けるべきこととして最も適切なものはどれか。

  1. Aフラグ変数に1を書いて、メイン処理に知らせること
  2. B割り込みの原因を示すビットを消すこと
  3. Cprintfでの長い文字列の出力や、何かが起こるまで待ち続けるループのような時間のかかる処理
答えと解説を見る

正解:C. printfでの長い文字列の出力や、何かが起こるまで待ち続けるループのような時間のかかる処理

割り込みハンドラが長く動いていると、その間はほかの割り込みに応えられず、メイン処理も止まります。printfは出力が終わるまで時間がかかり、中で割り込みを使うこともあるので特に危険です。ハンドラでは、データを受け取ってバッファに入れる、フラグを立てるといった最小限の処理だけを行い、重い処理はメイン処理やタスクに任せます。原因のビットを消すことも忘れてはいけません。

割り込みに優先度を付けられるマイコンで、優先度の低い割り込みのハンドラを実行中に、優先度の高い割り込みが起きた。一般にどうなるか(割り込みのネストを許す設定とする)。

  1. A低いハンドラを中断して高いハンドラを実行し、終わったら低いハンドラの続きに戻る
  2. B低いハンドラが終わるまで、高い割り込みは捨てられる
  3. C両方のハンドラが同時に、同じCPUで並列に実行される
答えと解説を見る

正解:A. 低いハンドラを中断して高いハンドラを実行し、終わったら低いハンドラの続きに戻る

割り込みに優先度を付けると、急ぎの割り込みは、ほかのハンドラを実行している最中でも割り込んで処理されます。例えばモーターの過電流の検出を高い優先度に、通信の受信を低い優先度にしておけば、受信の処理中でも過電流にすぐ対応できます。ArmのCortex-MのNVICなどがこの仕組みを持っています。同じか低い優先度の割り込みは、今のハンドラが終わるまで待たされます。

  1. 割り込みハンドラの処理を、すぐに行う短い部分と、あとで通常の文脈で行う残りの部分に分ける理由として正しいものはどれか。
  2. メイン処理でレジスタのビットを「reg |= mask;」(読み出し・変更・書き込み)で操作している最中に、割り込みハンドラが同じレジスタの別のビットを書き換えると起こりうる問題と対策の組み合わせとして正しいものはどれか。
  3. 16 MHzのクロックをプリスケーラで16分周したものでタイマを数え、1000カウントごとに割り込みを起こす設定にした。割り込みの間隔はいくらか。

組込み・ファームウェアの練習問題へ

関連する用語の解説

割り込み
外部機器からの要求などに応じて、実行中の処理を一時的に中断し、対応する処理を優先して行うCPUの仕組み。終わると元の処理に戻る。
ポーリング
CPUが周辺回路の状態を繰り返し調べに行って、変化を見つける方式。単純だが、何も起きていなくても調べ続けるので時間と電力を使う。
割り込みハンドラ
割り込みや例外が起きたときにCPUが実行する処理。中断した処理の状態を保存し、原因に応じた処理をして、元の処理に戻る。処理はできるだけ短くするのが原則。

関連する比較