輸入輸出系統與裝置管理
雙緩衝(double buffering)
想像自助餐線上的兩個托盤。當賓客正從一個托盤取餐時,廚房在看不見的地方補滿第二個托盤。第一個一空,工作人員就把它們交換——滿的端出來、空的送回廚房——服務因此從不暫停。雙緩衝正是用兩個記憶體緩衝區做這件事:一個正在被填滿(或排空),另一個正在被使用,作業系統在兩者間翻轉,使生產者與消費者能同時工作。
具體來說,假設一個裝置正在送出資料串流,而一個程式正在處理它。只有一個緩衝區時,裝置必須等程式讀完緩衝區,程式也必須等裝置把它填滿——它們輪流來,各自都有空閒。有兩個緩衝區時,裝置填滿緩衝區 A,程式同時處理緩衝區 B;當兩者都做完,它們交換角色。現在裝置填滿 B,程式啃 A。只要兩個階段花的時間大致相同,任一方都不必等另一方,產出率比走走停停的單緩衝情形幾乎翻倍。
為什麼重要:凡是穩定串流不容卡頓之處,到處都有雙緩衝。繪圖是經典例子:螢幕從一個影格緩衝區顯示,同時下一個影格被畫進第二個,然後在空白間隔時交換——這正是你不會看到畫一半的影格(撕裂)的原因。音訊播放、視訊擷取、磁帶或磁碟串流都用同樣的把戲。誠實的極限:雙緩衝只有在兩個階段速度匹配良好時才能平順;如果某一階段持續較慢,你終究還是會停滯,而非常突發性的工作量可能需要超過兩個緩衝區(一圈環狀緩衝區)。
一個程式分塊讀取檔案。磁碟填滿緩衝區 A;當程式處理 A 時,磁碟已經在填緩衝區 B;然後它們交換。磁碟與 CPU 同時工作,而不是互相等待。
填一個緩衝區的同時使用另一個,然後翻轉——以重疊取代閒置等待。
雙緩衝只有在生產者與消費者速度相近時才有幫助;如果其中一方持續是瓶頸,多出來的緩衝區救不了你——它只是把無可避免的停滯延後一個緩衝區的量。
又稱
另見