Caching

Basic Concept

Caching 是把資料的 copy 放在更快的 storage layer 中,以避免下次存取時還要到較慢的原始位置讀取。

Caching 的前提是資料有 locality:最近用過或常用的資料,接下來很可能再被使用。如果這個假設成立,cache hit 就能省下昂貴的 device access。

Cache vs Buffer

D-OS-comparsion-Buffer-Cache

Buffer Cache

實務上,kernel 常把同一塊 memory 同時當 buffer 和 cache。這就是 buffer cache。

當 application 發出 file I/O request 時,kernel 會先檢查 buffer cache:

  1. 如果 requested file region 已經在 memory,kernel 直接回傳資料,避免 physical disk I/O。
  2. 如果不在 memory,kernel 安排 device I/O,把資料讀入 buffer cache,再 copy 給 application。
  3. 對 write request,kernel 可以先把資料放進 buffer cache,稍後再 flush 到 disk。

Delayed Write

Write caching 允許 OS 暫時延後真正的 disk write。這樣做有幾個好處:

  • 多個小 write 可以累積成較大的 transfer。
  • Scheduler 可以重新安排 write order,提高 device efficiency。
  • 如果資料短時間內又被修改,可以避免把中間版本寫出。

但 delayed write 也帶來 consistency / durability 問題。若資料仍在 cache 中尚未寫入 storage 時系統 crash,該資料可能遺失。因此 OS 通常會週期性 flush dirty buffers,也提供 explicit flush / synchronous I/O 讓 application 在需要時強制寫入