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

MESI是一種廣泛使用的寫回策略的緩存一致性協(xié)議看靠。

MESI協(xié)議中的狀態(tài)

M:Modified被修改

E:Exclusive獨(dú)享的

S:Shared共享的

I:Invalid無(wú)效的

M: 被修改(Modified) 該緩存行只被緩存在該CPU的緩存中赂毯,并且是被修改過的(dirty),即與主存中的數(shù)據(jù)不一致固灵,該緩存行中的內(nèi)存需要在未來(lái)的某個(gè)時(shí)間點(diǎn)(允許其它CPU讀取請(qǐng)主存中相應(yīng)內(nèi)存之前)寫回(write back)主存汽畴。當(dāng)被寫回主存之后,該緩存行的狀態(tài)會(huì)變成獨(dú)享(exclusive)狀態(tài)颠黎。

E: 獨(dú)享的(Exclusive) 該緩存行只被緩存在該CPU的緩存中赵哲,它是未被修改過的(clean),與主存中數(shù)據(jù)一致俊柔。該狀態(tài)可以在任何時(shí)刻當(dāng)有其它CPU讀取該內(nèi)存時(shí)變成共享狀態(tài)(shared)筹麸。同樣地,當(dāng)CPU修改該緩存行中內(nèi)容時(shí)雏婶,該狀態(tài)可以變成Modified狀態(tài)竹捉。

S: 共享的(Shared) 該狀態(tài)意味著該緩存行可能被多個(gè)CPU緩存,并且各個(gè)緩存中的數(shù)據(jù)與主存數(shù)據(jù)一致(clean)尚骄,當(dāng)有一個(gè)CPU修改該緩存行中块差,其它CPU中該緩存行可以被作廢(變成無(wú)效狀態(tài)(Invalid))。

I: 無(wú)效的(Invalid) 該緩存是無(wú)效的(可能有其它CPU修改了該緩存行)倔丈。

一個(gè)例子來(lái)分析MESI的工作原理

利用對(duì)變量count自增的程序憨闰,來(lái)理解MESI的工作過程,明白多CPU下是如何進(jìn)行數(shù)據(jù)寫回同步需五,保證數(shù)據(jù)的可見性鹉动,


1.假設(shè)CPU1率先搶到時(shí)間片,當(dāng)變量count加載至CPU緩存中時(shí)宏邮,會(huì)將count的使用標(biāo)志為(E獨(dú)占:首次加載會(huì)將變量置為獨(dú)占泽示,也就說(shuō)明沒有其他CPU進(jìn)行加載)

2.CPU2也獲得時(shí)間片,把變量count加載緩存中蜜氨,此時(shí)count的使用標(biāo)志為(E獨(dú)占)械筛,并發(fā)送消息至總線,告知其他CPU讀取了變量的值飒炎,各CPU通過時(shí)刻監(jiān)聽(總線嗅探機(jī)制)獲得到此變量已被多個(gè)CPU所加載埋哟,那么此時(shí)CPU2就會(huì)將自身count的使用標(biāo)志置為(S共享),CPU1也會(huì)將變量的使用標(biāo)志也會(huì)置為(S)

3.CPU1從緩存中加載count至寄存器中進(jìn)行自增操作郎汪,執(zhí)行完畢之后赤赊,count = 0 -> 1闯狱,此時(shí)由于count的值發(fā)生了變化,因此CPU1中變量count使用標(biāo)志應(yīng)為(M修改)抛计,此時(shí)CPU1會(huì)發(fā)送消息至總線哄孤,告知其他線程已經(jīng)修改了變量count 的值,其他CPU嗅探到值的修改吹截,就會(huì)將自身變量count的使用標(biāo)志置為(I無(wú)效)

4.CPU1會(huì)將M狀態(tài)的變量立刻寫回至主內(nèi)存中录豺,寫回完畢之后,CPU1會(huì)將使用狀態(tài)置為(E獨(dú)享)饭弓,發(fā)送消息至總線双饥,告知其他CPU已經(jīng)寫回完畢,其他CPU會(huì)再此從主內(nèi)存中讀取變量count的值弟断,讀取完畢之后咏花,也會(huì)發(fā)送消息至總線,其他CPU嗅探到之后將自身變量count置為(S共享)阀趴,自身變量的使用狀態(tài)也會(huì)置為(S共享)

那么如果多個(gè)CPU同時(shí)都將變量置為M修改狀態(tài)昏翰,那怎么辦?首先多個(gè)CPU都想將變量置為M修改狀態(tài)刘急,那么系統(tǒng)會(huì)有裁決機(jī)制棚菊,保證只有一個(gè)CPU能夠操作成功,因此不會(huì)存在多個(gè)M狀態(tài)的數(shù)據(jù)

MESI操作的基本單位:緩存行(CPU緩存中的最小存儲(chǔ)單元)

緩存行的最小存儲(chǔ)單元大惺逯:32bit统求,64bit,128bit(因系統(tǒng)而定)

機(jī)械硬盤的最小存儲(chǔ)單元:簇

MESI緩存一致性協(xié)議失效的原因

緩存一致性協(xié)議失效的后果:當(dāng)MESI失效之后据块,那么系統(tǒng)會(huì)自動(dòng)將啟用總線加鎖機(jī)制码邻,那么執(zhí)行效率則會(huì)大打折扣。

失效的情況:

1.當(dāng)緩存行存儲(chǔ)的數(shù)據(jù)超過最小存儲(chǔ)單元大小時(shí)(數(shù)據(jù)長(zhǎng)度存儲(chǔ)跨越多個(gè)緩存行的情況)另假,就會(huì)導(dǎo)致MESI操作緩存行無(wú)效像屋,導(dǎo)致MESI緩存一致性協(xié)議失效;

2.系統(tǒng)不支持緩存一致性協(xié)議边篮。

緩存行的概念:多個(gè)數(shù)據(jù)可以存儲(chǔ)在一個(gè)緩存行己莺,一個(gè)數(shù)據(jù)可以存儲(chǔ)在多個(gè)緩存行(此種情況會(huì)導(dǎo)致MESI失效)

總線加鎖機(jī)制

對(duì)主內(nèi)存數(shù)據(jù)進(jìn)行加鎖和解鎖操作,當(dāng)加鎖之后戈轿,此數(shù)據(jù)不允許其他線程進(jìn)行讀寫凌受,只能等加鎖線程操作完畢進(jìn)行解鎖之后才能進(jìn)行操作。

Java中volatile關(guān)鍵字保證可見性原理

MESI緩存一致性協(xié)議底層是通過#Lock的指令進(jìn)行觸發(fā)的凶杖,

而volatile關(guān)鍵詞修飾之后的變量胁艰,編譯為指令時(shí)會(huì)加上#Lock修飾,用來(lái)觸發(fā)緩存一致性協(xié)議智蝠,而且#Lock指令修飾之后腾么,置為M(修改狀態(tài))的變量,會(huì)強(qiáng)制立刻寫入主內(nèi)存中杈湾,并且發(fā)送消息至總線解虱,其它加載此變量的線程,就會(huì)將工作內(nèi)存中變量的使用狀態(tài)修改為I(無(wú)效狀態(tài))漆撞,此時(shí)線程就被迫重新從主內(nèi)存中讀取該變量的值殴泰,這就是volatile關(guān)鍵詞保證可見性的原因。

volatile是Java虛擬機(jī)提供的輕量級(jí)的同步機(jī)制浮驳,它具備兩種特性:保證共享變量對(duì)所有線程的可見性悍汛;禁止指令重排序,保證有序性至会;無(wú)法保證原子性(像count++就不是原子操作离咐,包含了讀 自加操作)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奉件,隨后出現(xiàn)的幾起案子宵蛀,更是在濱河造成了極大的恐慌,老刑警劉巖县貌,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件术陶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡煤痕,警方通過查閱死者的電腦和手機(jī)梧宫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)摆碉,“玉大人祟敛,你說(shuō)我怎么就攤上這事≌捉猓” “怎么了馆铁?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)锅睛。 經(jīng)常有香客問我埠巨,道長(zhǎng),這世上最難降的妖魔是什么现拒? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任辣垒,我火速辦了婚禮,結(jié)果婚禮上印蔬,老公的妹妹穿的比我還像新娘勋桶。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布例驹。 她就那樣靜靜地躺著捐韩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹃锈。 梳的紋絲不亂的頭發(fā)上荤胁,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音屎债,去河邊找鬼仅政。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盆驹,可吹牛的內(nèi)容都是我干的圆丹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼躯喇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辫封!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起玖瘸,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秸讹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后雅倒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璃诀,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年蔑匣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劣欢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡裁良,死狀恐怖凿将,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情价脾,我是刑警寧澤牧抵,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站侨把,受9級(jí)特大地震影響犀变,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秋柄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一获枝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骇笔,春花似錦省店、人聲如沸嚣崭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雹舀。三九已至,卻和暖如春谎脯,著一層夾襖步出監(jiān)牢的瞬間葱跋,已是汗流浹背持寄。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工源梭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稍味。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓废麻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親模庐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烛愧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 存儲(chǔ)器層次結(jié)構(gòu)中,最快速的就是cpu一級(jí)別 在目前主流的計(jì)算機(jī)中掂碱,cpu執(zhí)行計(jì)算的主要流程如圖所示: 數(shù)據(jù)加載的流...
    Gino_4bd4閱讀 4,618評(píng)論 0 3
  • 一怜姿、高速緩存 高速緩存是一種存取速率遠(yuǎn)比主內(nèi)存大,而容量遠(yuǎn)比主內(nèi)存小的處理器存儲(chǔ)部件疼燥。引入高速緩存之后沧卢,處理器在執(zhí)...
    Djbfifjd閱讀 1,073評(píng)論 0 0
  • 【并發(fā)編程】CPU cache結(jié)構(gòu)和緩存一致性(MESI協(xié)議) - 厚積薄發(fā)者,輕舟萬(wàn)重山 - CSDN博客 一醉者、...
    聽一首老歌閱讀 1,861評(píng)論 0 3
  • 隨著多核時(shí)代的到來(lái)但狭,并發(fā)操作已經(jīng)成了很正常的現(xiàn)象,操作系統(tǒng)必須要有一些機(jī)制和原語(yǔ)撬即,以保證某些基本操作的原子性立磁,比如...
    kennethan閱讀 541評(píng)論 0 1
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友剥槐。感恩相遇唱歧!感恩不離不棄。 中午開了第一次的黨會(huì)粒竖,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,572評(píng)論 0 11