上篇文章介紹到, mesi 優化後無法保證快取間的強一致性,這時候如果程式中確實需要強一致性時,該怎麼辦?答案就是本篇要介紹的記憶體屏障。
記憶體屏障,為開發人員提供了一種強一致性的程式設計介面。記憶體屏障通常有兩種:寫記憶體屏障和讀記憶體屏障。
cpu 執行到屏障時,會將之前 store-buffer 中的資料寫回主存。相當於執行了一次 store-write 操作。
cpu 執行到該屏障時,會將cpu 中 invalid-queue 中的 invalid 指令全部執行完,重新讀取主存內的資料,相當於執行了一次 read-load 操作。
jvm 中的jmm 剛好也有類似於快取記憶體一致性的問題,所以提供了 volatile 、 synchronized 關鍵字來實現強制一致性,底層封裝了記憶體屏障的指令操作。
強一致性 弱一致性 最終一致性
這種方式在es等分布式系統中也有體現,可以設定主shard提交即返回成功,或者需要replica shard提交成功再返回。提到分布式架構就一定繞不開 一致性 問題,而 一致性 其實又包含了資料一致性和事務一致性兩種情況,本文主要討論資料一致性 事務一致性指acid 複製是導致出現資料一致性問題的唯...
記憶體管理 快取一致性
計算機在執行程式時,每條指令都是在cpu中執行的,而執行指令過程中,涉及到資料的讀取和寫入。由於程式執行過程中的臨時資料是存放在sram 物理記憶體 當中的,由於cpu執行速度很快,而從記憶體讀取數 據和向記憶體寫入資料的過程跟cpu執行指令的速度比起來要慢的多,因此如果任何時候對資料的操作都要通過...
快取一致性
一般應用而言,追求的都是快取的最終一致性。一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。引起這個問題的主要原因還是高併發的時...