現代處理器的發展歷史上,CPU的性能和內存性能差距逐漸拉大,為了解決這一問題,CPU設置了多級緩存結構
其中較為典型的有L1,L2,L3高速緩存
其中L1高速緩存具有和寄存器差不多的速度。
L1,L2,L3緩存都位於芯片內部,這些緩存我們統稱為Cache,下述就不再區分了
由於Cache位於CPU內部,意味着對於多個CPU,緩存之對於所在的CPU可見,那么對於每個CPU在處理數據的時候就不免會造成緩存和主存的數據不一致的問題
為了解決這個問題,CPU廠商提出了兩種解決方案
1,總線鎖定:當某個CPU處理數據時,通過鎖定系統總線或者時內存總線,讓其他CPU不具備訪問內存的訪問權限,從而保證了緩存的一致性
2,緩存一致性協議(MESI):緩存一致性協議也叫緩存鎖定,緩存一致性協議會阻止兩個以上CPU同時修改緩存了相同主存數據的緩存副本
總線鎖定開銷太大,現代的處理器已經很少采用這種方式保證緩存數據一致性,重點分析一下MESI協議,這對於JMM模型的理解也很有幫助
MESI是四個單詞的首字母縮寫,Modified修改,Exclusive獨占,Shared共享,Invalid無效,下圖是一個多CPU協同緩存的圖例1.
1.當CPU A將主存中的x cache line讀入緩存中時,此時X副本的狀態為E獨占。
2.當CPU B將主存中的X cache line讀入緩存中時,AB同時嗅探總線,得知X cache line不止一個副本,此時X的狀態變為S共享
3,當CPU A將CACHE A中的x cache line修改為1后,Cache A中的X cache line 的狀態變為M修改,並發送消息給CPU B,CPU將X cache line的狀態變為I無效
4.當CPU A確認所有CPU緩存中的都提交了I無效狀態,將修改后的值刷新到主存中,此時主存中的X變為了1,此時Cache A中的x cache line變為E獨享
5.當CPU B需要用到X,發出讀取X指令,於是讀取主存中的x,於是重復第二步