割り込みとポーリングの違い:仕組みと使い分けを比較
デバイスが対応を求めていることを、プロセッサが知る方法は2つあります。ポーリングでは、CPUがループの中でデバイスの状態を何度も確認します。割り込みでは、デバイスがCPUへ信号を送り、CPUは、していた作業を止めて小さなハンドラを実行し、そのあと元に戻ります。ポーリングは、単純で予測しやすい反面、時間を無駄にします。割り込みは、効率がよく応答も速い反面、負荷が加わり、プログラムの動きを考えにくくなります。
| 項目 | ポーリング | 割り込み |
|---|---|---|
| 仕組み | CPUがステータスレジスタを繰り返し読み、デバイスの準備ができたかを確認する | デバイスが信号を出し、CPUは作業を中断して、割り込みハンドラ(ISR)を実行する |
| 待っている間のCPU | ビジー。確認のためにサイクルを使う | 空いている。ほかの仕事をしたり、スリープしたりできる |
| 応答時間 | ループの確認の間隔で決まる。予測しやすい | 速い(マイクロ秒)。ただし、マスク、優先度、コンテキストの保存で変わる |
| オーバーヘッド | 何も起きなくても一定 | イベントごとにコストがかかる。イベントが非常に多いと、CPUが追いつかなくなる(割り込みストーム) |
| 複雑さ | 書きやすく、デバッグしやすい | 複雑。ハンドラは短くする必要があり、メインのコードとの共有データには注意が要る(volatile、アトミックなアクセス) |
| 消費電力 | CPUを起こしたままにする | イベントで起こされるまで、低消費電力でスリープできる |
| タイミングの考えやすさ | 考えやすい | ハンドラとメインのコードの間で、並行処理のバグが起こりうる |
| 主な用途 | 非常に速い、または連続するイベント、単純なプログラム、高速なネットワークのドライバ | タイマー、ボタン、通信のイベント、センサーの警告、スリープからの復帰 |
数値は代表的な目安で、世代や製品によって異なります。