快取不一致

2022-08-14 18:33:11 字數 792 閱讀 8816

當程式在執行過程中,會將運算需要的資料從主存複製乙份到cpu的快取記憶體當中,那麼cpu進行計算時就可以直接從它的快取記憶體讀取資料和向其中寫入資料,當運算結束之後,再將快取記憶體中的資料重新整理到主存當中。

舉個簡單的例子:i = i +1。當執行緒執行這個語句時,會先從主存當中讀取i的值,然後複製乙份到快取記憶體當中,然後cpu執行指令對i進行加1操作,然後將資料寫入快取記憶體,最後將快取記憶體中i最新的值重新整理到主存當中。在單執行緒環境下沒問題,但是當在多個執行緒同時執行的時候就可能出現問題。

比如同時有2個執行緒執行這段**,假如初始時i的值為0初始時,兩個執行緒分別讀取i的值存入各自所在的cpu的快取記憶體當中,然後執行緒1進行加1操作,然後把i的最新值1寫入到記憶體。此時執行緒2的快取記憶體當中i的值還是0,進行加1操作之後,i的值為1,然後執行緒2把i的值寫入記憶體。最終結果i的值是1,而不是2。這就是著名的快取一致性問題。通常稱這種被多個執行緒訪問的變數為共享變數。

為了解決快取不一致性問題,通常來說有以下2種解決方法:

通過在匯流排加lock鎖的方式

就是當存在乙個乙個執行緒訪問共享變數時,我們就鎖住匯流排,這個時候其他執行緒訪問該變數的記憶體時就會被阻塞。直到該**執行完成。由於在鎖住匯流排期間,其他cpu無法訪問記憶體,會導致效率低下

通過快取一致性協議

例如mesi協議:mesi協議保證了每個快取中使用的共享變數的副本是一致的。它核心的思想是:當cpu寫資料時,如果發現操作的變數是共享變數,即在其他cpu中也存在該變數的副本,會發出訊號通知其他cpu將該變數的快取行置為無效狀態,因此當其他cpu需要讀取這個變數時,發現自己快取中快取該變數的快取行是無效的,那麼它就會從記憶體重新讀取。

快取不一致問題分析

快取不一致問題 快取更新的4種策略 解決方案 延時雙刪除,偽 如下 public void write string key,object data 假設這會有兩個請求,乙個請求a做查詢操作,乙個請求b做更新操作,那麼會有如下情形產生 1 快取剛好失效 2 請求a查詢資料庫,得乙個舊值 3 請求b將...

線上快取不一致問題排查

兩個系統共用同一張表,只是維護的字段不一樣。email 郵箱 是我們新版本中新支援的功能。綜合系統沒有 email 字段,會員系統裡有 email 字段。使用者反饋說 郵箱收不郵件,去設定中看,郵箱設定會自動消失。重新設定一下就好了。一 排查資料問題 懷疑是綜合系統中,將 email 字段更新成了預...

version magic 不一致問題

碰到乙個問題,在開發過程中發現以前編譯的模組載入失敗了。wlan version magic 4.1.15 gfb2dbf6 smp preempt mod unload armv7 p2v8 should be 4.1.15 ge5de83b dirty smp preempt mod unloa...