學(xué)習(xí)慕課網(wǎng)-<java并發(fā)編程與高并發(fā)解決方案>之后,自己的理解.參考文章https://blog.csdn.net/jjavaboy/article/details/77164474
MESI協(xié)議:用于保證CPU cache之間緩存共享數(shù)據(jù)的一致性.
四種狀態(tài):
M:modified 修改的
E:exclusive 獨享的
S:shared 共享的
I:invalid 無效的
四種操作:
local read: 讀本地緩存中的數(shù)據(jù);
local write: 將數(shù)據(jù)寫到本地的緩存中;
remote read:從主存中讀取數(shù)據(jù).? (個人理解:其他核讀到了本核的內(nèi)存,在此之前,本核內(nèi)存已經(jīng)存入主存中了;但是當本核內(nèi)存中的狀態(tài)是I無效的,別處是讀不到的);
remote write:將本地數(shù)據(jù)寫回主存中;
在MESI協(xié)議中,每個Cache的Cache控制器不僅知道自己的讀寫操作樟遣,而且也監(jiān)聽(snoop)其它Cache的讀寫操作而叼。每個Cache line所處的狀態(tài)根據(jù)本核和其它核的讀寫操作在4個狀態(tài)間進行遷移。
MESI協(xié)議狀態(tài)遷移分析:
I狀態(tài)(Invalid)下:
? ? Local Read操作:
? ? ? ? ? ? 其他緩存先沒有此數(shù)據(jù),本cache直接從自身內(nèi)存去,此時是獨享的,狀態(tài)變?yōu)镋;
? ? ? ? ? ? 其他cache有這份數(shù)據(jù),且狀態(tài)為M,表明其他緩存該數(shù)據(jù)已修改,需要將數(shù)據(jù)更新到內(nèi)存中,本cache再從內(nèi)存中取出該數(shù)據(jù),此時兩個cache的該數(shù)據(jù)共享,狀態(tài)變?yōu)镾;
? ? ? ? ? ? 如果其他Cache有這份數(shù)據(jù),且狀態(tài)為S或者E,本Cache從內(nèi)存中取數(shù)據(jù),這些cache的cache line狀態(tài)都變?yōu)镾
? ? ? ? Local Write操作:
????????????????從內(nèi)存中取數(shù)據(jù).在cache中修改,狀態(tài)變?yōu)镸;
? ? ? ? ? ? ? ? 如果其他cache中有這份數(shù)據(jù),且狀態(tài)為M,則要先將數(shù)據(jù)更新到內(nèi)存;
? ? ? ? ? ? ? ? 如果其他cache有這份數(shù)據(jù),則其他cache的cache line狀態(tài)都變?yōu)镮
? ? ? ? Remote Read操作和Remote Write操作:
? ? ? ? ? ? ? ? 既然本核是Invalid,別核的操作與它無關(guān);
E狀態(tài)(Exclusive)下:
? ? ? ? Local Read操作:
? ? ? ? ? ? ? ? 獨享,從自己cache中取數(shù)據(jù),狀態(tài)不變;
? ? ? ? Local Write操作:
? ? ? ? ? ? ? ? 修改cache中的數(shù)據(jù),狀態(tài)不變;
? ? ? ? Remote Read操作:
? ? ? ? ? ? ? ? 其他核會讀取到本核的數(shù)據(jù),數(shù)據(jù)要跟其他核數(shù)據(jù)分享,狀態(tài)變?yōu)镾;
? ? ? ? Remote Write操作:
? ? ? ? ? ? ? ? 數(shù)據(jù)被修改了,本Cache Line不能再使用,狀態(tài)變?yōu)镮
S狀態(tài)(share)下:
? ? ? ? Local Read操作:
? ? ? ? ? ? ? ? 從Cache中取數(shù)據(jù),狀態(tài)不變;
? ? ? ? Local Write操作:
? ? ? ? ? ? ? ? 修改Cache中的數(shù)據(jù),狀態(tài)變成了M;
? ? ? ? ? ? ? ? 其他核共享的cache Line狀態(tài)變成了I;
? ? ? ? Remote Read操作:
? ? ? ? ? ? ? ? 狀態(tài)不變;
? ? ? ? Remote Write操作:
? ? ? ? ? ? ? ? 數(shù)據(jù)在別的核被修改,那么本Cache line不能再使用,狀態(tài)變?yōu)镮;
M狀態(tài)(Modified)下:
? ? ? ? Local Read操作:
? ? ? ? ? ? ? ? 從Cache中去數(shù)據(jù),狀態(tài)不變;
? ? ? ? Local Write操作:
? ? ? ? ? ? ? ? 修改Cache中的數(shù)據(jù),狀態(tài)不變;
? ? ? ? Remote Read操作:
? ? ? ? ? ? ? ? 別核進行讀的時候,會讀到此處M狀態(tài)的數(shù)據(jù) ,此處狀態(tài)變?yōu)镾;
? ? ? ? Remote Write操作:
? ? ? ? ? ? ? ? 別核進行了寫的操作,那么此時別核掌握最新的數(shù)據(jù),此cache的狀態(tài)變?yōu)闊o效I;