儲存、匯流排與輸入輸出
輪詢(polling)
想像你在烤蛋糕,每十秒就打開烤箱看一次熟了沒。蛋糕一好你立刻就知道,但守在烤箱旁的時候你什麼別的事都做不了。輪詢就是電腦版的「一再查看」。CPU 反覆問裝置「你做完了沒?」——在一個緊湊迴圈裡讀裝置的狀態暫存器——直到答案是「好了」。它是處理裝置事件三種方式中最簡單的一種。
機制上,輪詢是一個讀狀態暫存器並測試某個位元的迴圈:當「就緒」位元是 0 時,迴圈、再讀一次;當它翻成 1,就往下走。除了記憶體映射 I/O 以外,不需要任何特殊硬體技巧,這就是輪詢好寫又好推理的原因。問題在於每一次那樣的狀態讀取,都是 CPU 在空轉、沒做有用的事;這稱為忙碌等待。若裝置要花十毫秒才完成,CPU 可能浪費數百萬個週期在問「好了?好了?好了?」。
那麼輪詢何時是對的選擇,何時又是浪費?當等待非常短,或當你想要最低的延遲且有多餘 CPU 可燒時,輪詢勝出——例如高速網路或 NVMe 驅動程式可能採用輪詢,因為中斷的開銷會比那短暫的空轉更貴。當等待又長又難以預測時,輪詢就輸了;這時你想要中斷,好讓 CPU 去睡覺或做別的事,只在裝置就緒時被喚醒。誠實的總結:輪詢拿 CPU 時間換取簡單與低延遲;中斷拿一點延遲與複雜度換取不浪費 CPU。
用文字描述的輪詢迴圈:寫下命令,然後「讀狀態;若未就緒,再讀狀態;重複」直到就緒,再讀資料。若裝置在 50 奈秒就就緒,輪詢很棒。若它要花 10 毫秒,CPU 就白白燒了數百萬個週期問同一個問題。
同一個迴圈,對次微秒的等待很出色,對毫秒級的等待則是災難。
輪詢並不總是「落伍的老方法」。對最快的現代裝置,專用輪詢可以勝過中斷,因為在次微秒延遲下,進出一次中斷的成本超過了短暫空轉。
又称
另见