2021-09-06 MESI緩存一致性協(xié)議

緩存一致性協(xié)議(MESI)

在目前主流的計(jì)算機(jī)中兼蕊,cpu執(zhí)行計(jì)算的主要流程如圖所示:

image

數(shù)據(jù)加載的流程如下:

1.將程序和數(shù)據(jù)從硬盤加載到內(nèi)存中

2.將程序和數(shù)據(jù)從內(nèi)存加載到緩存中(目前多三級緩存,數(shù)據(jù)加載順序:L3->L2->L1)

3.CPU將緩存中的數(shù)據(jù)加載到寄存器中映胁,并進(jìn)行運(yùn)算

4.CPU會將數(shù)據(jù)刷新回緩存房午,并在一定的時間周期之后刷新回內(nèi)存

緩存一致性協(xié)議發(fā)展背景
現(xiàn)在的CPU基本都是多核CPU,服務(wù)器更是提供了多CPU的支持,而每個核心也都有自己獨(dú)立的緩存昧互,當(dāng)多個核心同時操作多個線程對同一個數(shù)據(jù)進(jìn)行更新時挽铁,如果核心2在核心1還未將更新的數(shù)據(jù)刷回內(nèi)存之前讀取了數(shù)據(jù),并進(jìn)行操作敞掘,就會造成程序的執(zhí)行結(jié)果造成隨機(jī)性的影響叽掘,這對于我們來說是無法容忍的。

而總線加鎖是對整個內(nèi)存進(jìn)行加鎖玖雁,在一個核心對一個數(shù)據(jù)進(jìn)行修改的過程中更扁,其他的核心也無法修改內(nèi)存中的其他數(shù)據(jù),這樣對導(dǎo)致CPU處理性能嚴(yán)重下降赫冬。

緩存一致性協(xié)議提供了一種高效的內(nèi)存數(shù)據(jù)管理方案浓镜,它只會對單個緩存行(緩存行是緩存中數(shù)據(jù)存儲的基本單元)的數(shù)據(jù)進(jìn)行加鎖,不會影響到內(nèi)存中其他數(shù)據(jù)的讀寫劲厌。

因此膛薛,我們引入了緩存一致性協(xié)議來對內(nèi)存數(shù)據(jù)的讀寫進(jìn)行管理。

MESI協(xié)議
緩存一致性協(xié)議有MSI补鼻,MESI哄啄,MOSI,Synapse风范,F(xiàn)irefly及DragonProtocol等等咨跌,接下來我們主要介紹MESI協(xié)議。

MESI分別代表緩存行數(shù)據(jù)所處的四種狀態(tài)乌企,通過對這四種狀態(tài)的切換虑润,來達(dá)到對緩存數(shù)據(jù)進(jìn)行管理的目的。

| 狀態(tài) | 描述 | 監(jiān)聽任務(wù) |
| M 修改(Modify) | 該緩存行有效加酵,數(shù)據(jù)被修改了拳喻,和內(nèi)存中的數(shù)據(jù)不一致,數(shù)據(jù)只存在于本緩存行中 | 緩存行必須時刻監(jiān)聽所有試圖讀該緩存行相對應(yīng)的內(nèi)存的操作猪腕,其他緩存須在本緩存行寫回內(nèi)存并將狀態(tài)置為E之后才能操作該緩存行對應(yīng)的內(nèi)存數(shù)據(jù) |
| E 獨(dú)享冗澈、互斥(Exclusive) | 該緩存行有效,數(shù)據(jù)和內(nèi)存中的數(shù)據(jù)一致陋葡,數(shù)據(jù)只存在于本緩存行中 | 緩存行必須監(jiān)聽其他緩存讀主內(nèi)存中該緩存行相對應(yīng)的內(nèi)存的操作亚亲,一旦有這種操作,該緩存行需要變成S狀態(tài) |
| S 共享(Shared) | 該緩存行有效腐缤,數(shù)據(jù)和內(nèi)存中的數(shù)據(jù)一致捌归,數(shù)據(jù)同時存在于其他緩存中 | 緩存行必須監(jiān)聽其他緩存是該緩存行無效或者獨(dú)享該緩存行的請求,并將該緩存行置為I狀態(tài) |
| I 無效(Invalid) | 該緩存行數(shù)據(jù)無效 | 無 |

備注:

1.MESI協(xié)議只對匯編指令中執(zhí)行加鎖操作的變量有效岭粤,表現(xiàn)到j(luò)ava中為使用voliate關(guān)鍵字定義變量或使用加鎖操作

2.對于匯編指令中執(zhí)行加鎖操作的變量惜索,MESI協(xié)議在以下兩種情況中也會失效:

 一、CPU不支持緩存一致性協(xié)議剃浇。

 二巾兆、該變量超過一個緩存行的大小猎物,緩存一致性協(xié)議是針對單個緩存行進(jìn)行加鎖,此時角塑,緩存一致性協(xié)議無法再對該變量進(jìn)行加鎖蔫磨,只能改用總線加鎖的方式。

MESI工作原理:(此處統(tǒng)一默認(rèn)CPU為單核CPU圃伶,在多核CPU內(nèi)部執(zhí)行過程和一下流程一致)

1、CPU1從內(nèi)存中將變量a加載到緩存中留攒,并將變量a的狀態(tài)改為E(獨(dú)享)煤惩,并通過總線嗅探機(jī)制對內(nèi)存中變量a的操作進(jìn)行嗅探

image

2、此時炼邀,CPU2讀取變量a魄揉,總線嗅探機(jī)制會將CPU1中的變量a的狀態(tài)置為S(共享),并將變量a加載到CPU2的緩存中拭宁,狀態(tài)為S

image

3洛退、CPU1對變量a進(jìn)行修改操作,此時CPU1中的變量a會被置為M(修改)狀態(tài)杰标,而CPU2中的變量a會被通知兵怯,改為I(無效)狀態(tài),此時CPU2中的變量a做的任何修改都不會被寫回內(nèi)存中(高并發(fā)情況下可能出現(xiàn)兩個CPU同時修改變量a腔剂,并同時向總線發(fā)出將各自的緩存行更改為M狀態(tài)的情況媒区,此時總線會采用相應(yīng)的裁決機(jī)制進(jìn)行裁決,將其中一個置為M狀態(tài)掸犬,另一個置為I狀態(tài)袜漩,且I狀態(tài)的緩存行修改無效)

image

4、CPU1將修改后的數(shù)據(jù)寫回內(nèi)存湾碎,并將變量a置為E(獨(dú)占)狀態(tài)

image

5宙攻、此時,CPU2通過總線嗅探機(jī)制得知變量a已被修改介褥,會重新去內(nèi)存中加載變量a座掘,同時CPU1和CPU2中的變量a都改為S狀態(tài)

image

在上述過程第3步中,CPU2的變量a被置為I(無效)狀態(tài)后柔滔,只是保證變量a的修改不會被寫回內(nèi)存溢陪,但CPU2有可能會在CPU1將變量a置為E(獨(dú)占)狀態(tài)之前重新讀取內(nèi)存中的變量a,這個取決于匯編指令是否要求CPU2重新加載內(nèi)存睛廊。

總結(jié)
以上就是MESI的執(zhí)行原理嬉愧,MESI協(xié)議只能保證并發(fā)編程中的可見性,并未解決原子性和有序性的問題喉前,所以只靠MESI協(xié)議是無法完全解決多線程中的所有問題没酣。
————————————————
版權(quán)聲明:本文為CSDN博主「生煮雞蛋」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議卵迂,轉(zhuǎn)載請附上原文出處鏈接及本聲明裕便。
原文鏈接:https://blog.csdn.net/alignjava/article/details/99070162

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市见咒,隨后出現(xiàn)的幾起案子偿衰,更是在濱河造成了極大的恐慌,老刑警劉巖改览,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件下翎,死亡現(xiàn)場離奇詭異,居然都是意外死亡宝当,警方通過查閱死者的電腦和手機(jī)视事,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庆揩,“玉大人俐东,你說我怎么就攤上這事《┥危” “怎么了虏辫?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锈拨。 經(jīng)常有香客問我砌庄,道長,這世上最難降的妖魔是什么奕枢? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任娄昆,我火速辦了婚禮,結(jié)果婚禮上验辞,老公的妹妹穿的比我還像新娘稿黄。我一直安慰自己,他們只是感情好跌造,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布杆怕。 她就那樣靜靜地躺著,像睡著了一般壳贪。 火紅的嫁衣襯著肌膚如雪陵珍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天违施,我揣著相機(jī)與錄音互纯,去河邊找鬼。 笑死磕蒲,一個胖子當(dāng)著我的面吹牛留潦,可吹牛的內(nèi)容都是我干的只盹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兔院,長吁一口氣:“原來是場噩夢啊……” “哼殖卑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坊萝,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤孵稽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后十偶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菩鲜,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年惦积,在試婚紗的時候發(fā)現(xiàn)自己被綠了接校。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡荣刑,死狀恐怖馅笙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厉亏,我是刑警寧澤董习,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站爱只,受9級特大地震影響皿淋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恬试,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一窝趣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧训柴,春花似錦哑舒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仗嗦,卻和暖如春膘滨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稀拐。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工火邓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓铲咨,卻偏偏與公主長得像躲胳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纤勒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容