中斷與輪詢的差異:比較機制與使用時機

處理器得知裝置需要處理的方式有兩種。輪詢是由 CPU 在迴圈中反覆確認裝置的狀態。中斷則是由裝置向 CPU 送出訊號,CPU 暫停手邊的工作去執行一個小型的處理常式,之後再回到原本的工作。輪詢簡單且容易預測,但會浪費時間;中斷有效率且回應快,但會增加負擔,也讓程式的行為更難掌握。

項目輪詢中斷
機制CPU 反覆讀取狀態暫存器,確認裝置是否就緒裝置發出訊號,CPU 中斷工作並執行中斷處理常式(ISR)
等待期間的 CPU忙碌。耗用週期來進行確認閒置。可以處理其他工作或進入睡眠
回應時間由迴圈的確認間隔決定。容易預測快(微秒等級)。但會因遮罩、優先權與上下文儲存而改變
額外負擔即使什麼都沒發生也是固定的每個事件都有成本。事件非常多時,CPU 會來不及處理(中斷風暴)
複雜度容易撰寫,也容易除錯複雜。處理常式必須簡短,與主程式共用的資料也要小心(volatile、原子存取)
耗電量讓 CPU 一直保持喚醒可在低耗電下睡眠,直到被事件喚醒
時序是否容易掌握容易掌握處理常式與主程式之間可能發生並行處理的錯誤
主要用途非常快速或連續的事件、簡單的程式、高速網路驅動程式計時器、按鈕、通訊事件、感測器警報、從睡眠中喚醒

數值為具代表性的大致參考值,會因世代或產品而異。

適用於什麼情況

輪詢
事件頻繁時,或是迴圈簡單、想要可預測的時序而不想有處理常式的複雜度時。
中斷
事件罕見或無法預測、想要快速回應與低耗電,且 CPU 還有其他工作時。
併用
也有系統會組合使用。以中斷通知第一個事件,在通訊量大的期間由驅動程式改用輪詢。高速網路驅動程式即是一例。

常見問題

中斷與輪詢哪一個比較好?

不能說哪一個永遠比較好。中斷回應快,也能讓 CPU 睡眠;輪詢簡單且容易預測。罕見的事件用中斷,非常頻繁的事件用輪詢。

中斷處理常式應該做什麼?

要保持簡短。只做最少的處理,設置旗標或把工作放入佇列後就返回。在處理常式中做冗長的處理或會產生等待的呼叫,會損害回應性。

什麼是中斷風暴?

事件來得太快,使 CPU 把時間全花在進出處理常式上的狀態。高速網路驅動程式在這種情況下會切換成輪詢。

為什麼中斷能節省耗電量?

因為 CPU 不必一直醒著確認,可以睡眠到被事件喚醒為止。

相關名詞的解說

中斷
回應外部裝置的請求等,暫時中止執行中的處理,優先進行對應處理的 CPU 機制。結束後回到原本的處理。
輪詢(Polling)
CPU 反覆去檢查周邊電路的狀態,藉以發現變化的方式。雖然單純,但即使什麼都沒發生也持續檢查,因此耗費時間與電力。
中斷處理常式
發生中斷或例外時CPU所執行的處理。儲存被中斷處理的狀態,依原因進行相應處理後,回到原本的處理。原則上處理要盡可能簡短。

相關的比較