輸入輸出系統與裝置管理

輪詢(polling)

輪詢就是反覆地問「你好了沒?」這個動作。想像後座的小孩整趟旅程每十秒就問一次「到了沒?」在計算機裡,輪詢意指 CPU 在迴圈中不斷讀取某個裝置的狀態暫存器,一遍又一遍檢查同一個旗標,直到裝置說它完成了。它是程式化輸入輸出所採用的等待策略。

具體來說,一個輪詢迴圈看起來像:讀狀態暫存器;如果就緒位元未設定,就跳回去再讀一次;一旦它被設定,就進行傳輸。這背後有一個小小的交握協定——控制器有一個忙碌位元,工作時把它設起來,還有一個完成/就緒位元,做完時設起來,而 CPU 就看著這些位元。讀一次狀態暫存器很便宜(通常只是幾條指令)。代價在於,當一個緩慢裝置慢慢爬向完成時,要做成千上萬甚至上百萬次這樣的讀取,這稱為忙碌等待:CPU 很忙,卻什麼也沒成就。

為什麼重要:輪詢極其簡單,對於幾乎瞬間回應的裝置延遲極低,也省去了設定中斷的額外開銷——所以對極快的裝置,或當你只會等待少少幾個週期時,它真的是正確選擇。但對緩慢裝置,它浪費掉大量 CPU 時間,而且很難在等待時順便做別的事。正是這個取捨催生了中斷:與其讓 CPU 一問再問,不如由裝置在真正就緒時才拍一下 CPU 的肩膀。

while 不是(狀態暫存器已設定 READY 位元):持續迴圈;然後讀資料暫存器。如果裝置要花 5 毫秒,一顆 3 GHz 的 CPU 可能會把這個檢查空轉約一千五百萬次,卻什麼有用的事都沒做。

每次檢查很便宜,但對慢速裝置重複上百萬次就是災難。

輪詢並不總是錯的:對於在奈秒內就就緒的裝置,輪詢可能勝過中斷,因為中斷的設定與環境切換成本會佔上風。真正的錯誤是去輪詢一個慢速裝置,那只會白白燒掉週期。

又稱
busy-wait pollingpolled waiting輪詢等待