Buffering

Basic Concept

Buffering 是 OS 在資料傳輸途中使用一段 memory buffer 暫存資料的機制。資料可能是在兩個 devices 之間移動,也可能是在 device 和 application 之間移動;buffer 就是中間的暫存區。

重要的是,buffer 不只是「快取」。它有時候是資料目前唯一存在的地方。例如 network packet 剛進來、還沒被 application 讀走時,kernel buffer 裡的那份資料可能就是目前唯一的 copy。因此 buffering 的核心是讓 producer 和 consumer 不必完全同步。

producer → buffer → consumer

Producer 可以先把資料放進 buffer,consumer 之後再取走;兩邊速度、資料單位、生命週期不必完全一致。

Why Buffering Exists

Speed mismatch

不同 device 的速度差異可能非常大。例如從 network 下載 file 並寫入 SSD 時,network 可能比 SSD 慢很多,而且 arrival pattern 不穩定。OS 可以先在 main memory 建立 buffer 累積 network bytes,等累積到一定量後再一次寫入 SSD。

如果使用 double buffering,流程會是:

  1. Network 填滿 buffer A。
  2. OS 要求 SSD 寫出 buffer A。
  3. SSD 寫 buffer A 時,network 繼續填 buffer B。
  4. Buffer B 滿後,若 A 已寫完,就切回 A 讓 Network 繼續寫。

這樣 producer(network)和 consumer(SSD)被 decouple,兩者不用互相等待到完全同步。

Transfer size mismatch

不同層的資料單位可能不同。Network 可能要求把大 message 拆成小 packet 傳送;接收端則需要把多個 packet 重新組成原本的 message。

這時 buffer 用於:

  • fragmentation:sender 把 large message 暫存後切成 packets。
  • reassembly:receiver 把收到的 packets 放進 buffer,等資料完整後重建 message。

Copy semantics

Copy semantics 是指 application 發出 I/O system call 的那一刻,OS 保證之後真正寫出去的是當時的資料版本,而不受 application 後續修改 buffer 的影響。

Buffer vs Cache

D-OS-comparsion-Buffer-Cache