記憶體階層與快取
寫穿/直寫(write-through)
回到編輯借來的文件——但這次你每改一句,就在檔案庫裡重新歸檔一份最新副本。這比較費工、也比較慢,但檔案庫永遠完美地最新:任何查閱它的人都看到你最新的編輯。寫穿就是快取這種積極的做法:每次寫入都同時更新快取「與」下方較慢的記憶體,讓兩者永遠一致。
寫入時,寫穿快取在更新自己副本的同時,立刻把資料轉送到下一層。沒有髒位元要追蹤、淘汰時也沒有延後的寫回,因為記憶體從不落後——淘汰一條列輕而易舉,因為記憶體已有最新的值。明顯的缺點是每次寫入都對慢的層級產生流量,所以一個在緊湊迴圈裡更新的熱變數,天真地看會產生大量慢記憶體寫入。這由寫入緩衝區馴服:一個小佇列以快取速度接受寫入、在背景把它們排放到記憶體,於是 CPU 通常不必停下來等每筆儲存完成。
寫穿買到簡單與永遠一致的記憶體視圖,當其他代理直接讀記憶體時(某些 I/O 與多處理器情境)這確實有價值,但它以寫入頻寬作為代價。相關而正交的選擇是:寫入「未命中」時怎麼辦——寫入配置(先把列抓進快取再寫,押注對該列還會有更多寫入)對上不配置(直接寫進記憶體、略過快取)。寫回快取通常配寫入配置;寫穿快取常配不配置。誠實的總結:寫穿較簡單、對一致性較安全,但在大量寫入下較慢,這正是為何高效能快取絕大多數改選寫回。
一次儲存更新快取列,同時也被推往記憶體;CPU 把它丟進寫入緩衝區後繼續跑。若緩衝區在記憶體把它排空之前先滿了,CPU 就必須停頓——這正是寫回靠完全延後寫入所避開的代價。
每次寫入同時更新快取與記憶體;寫入緩衝區掩蓋記憶體寫入的延遲。
寫穿讓記憶體永遠最新,代價是寫入頻寬,所以高效能快取偏好寫回。別把寫入策略(穿 vs 回)和寫入未命中策略(是否寫入配置)混淆——它們是獨立選擇,只是依慣例常被配在一起。
又稱
另見