Caching
Basic Concept
Caching 是把資料的 copy 放在更快的 storage layer 中,以避免下次存取時還要到較慢的原始位置讀取。
Caching 的前提是資料有 locality:最近用過或常用的資料,接下來很可能再被使用。如果這個假設成立,cache hit 就能省下昂貴的 device access。
Cache vs Buffer
Buffer Cache
實務上,kernel 常把同一塊 memory 同時當 buffer 和 cache。這就是 buffer cache。
當 application 發出 file I/O request 時,kernel 會先檢查 buffer cache:
- 如果 requested file region 已經在 memory,kernel 直接回傳資料,避免 physical disk I/O。
- 如果不在 memory,kernel 安排 device I/O,把資料讀入 buffer cache,再 copy 給 application。
- 對 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 在需要時強制寫入