自旋鎖--緩存一致性風(fēng)暴優(yōu)化案例

本文用于理解各種自旋鎖對(duì)于緩存一致性風(fēng)暴進(jìn)行的優(yōu)化


案例一: TAS鎖引起的緩存一致性風(fēng)暴

TAS鎖.png

假設(shè)機(jī)器是64位的晤碘,CPU一次讀取64bit馍刮,即8個(gè)字節(jié)的數(shù)據(jù)高速緩存L1的一個(gè)緩存塊开睡;有2個(gè)CPU,每個(gè)CPU都有一個(gè)L1高速緩存;4個(gè)線程裹虫,一次為T1,T2,T3,T4飞盆;CPU1執(zhí)行線程T1娄琉,CPU2執(zhí)行線程T2,CPU1執(zhí)行線程T3吓歇,CPU2執(zhí)行線程T4孽水;4個(gè)線程競(jìng)爭(zhēng)鎖的順序是T1->T2->T3->T4,則

  1. 當(dāng)線程1在CPU1上執(zhí)行while(state.getAndSet(true))時(shí)城看,即state記錄的共享地址讀取true值到L1的一個(gè)緩存塊女气,記錄該緩存塊d11的狀態(tài)為exclusive;
  2. 當(dāng)線程2在CPU2執(zhí)行while(state.getAndSet(true))時(shí)析命,CPU1檢測(cè)到地址沖突主卫,如果CPU1的L1里記錄state的緩存塊的狀態(tài)已經(jīng)是shared逃默,則不做操作;否則將CPU1的L1里記錄state的緩存塊的狀態(tài)修改為shared簇搅。CPU2從state記錄的共享地址讀取true值到L1的一個(gè)緩存塊完域,記錄該緩存塊的狀態(tài)為shared;
  3. 當(dāng)線程3在CPU1執(zhí)行while(state.getAndSet(true))時(shí)瘩将,由于CPU1的L1里記錄state的緩存塊的狀態(tài)已經(jīng)是shared吟税,所以不做操作。線程4的情況類(lèi)似姿现,就省略肠仪;
  4. 當(dāng)線程1在CPU1上執(zhí)行state.set(false)時(shí),修改L1里記錄該state值的緩存塊的狀態(tài)為modified备典,并發(fā)起“修改各自高速緩存中記錄共享數(shù)據(jù)的緩存塊狀態(tài)為invalid”的廣播請(qǐng)求异旧。CPU2收到該廣播請(qǐng)求后,就將其上的L1里記錄共享數(shù)據(jù)state的緩存塊狀態(tài)為invalid提佣;
  5. 當(dāng)線程2在CPU2執(zhí)行while(state.getAndSet(true))時(shí)吮蛹,發(fā)現(xiàn)其L1中記錄該state值的緩存塊的狀態(tài)為invalid,然后發(fā)起“從主內(nèi)中讀取共享數(shù)據(jù)”的廣播請(qǐng)求拌屏。CPU1收到該廣播請(qǐng)求后潮针,將其上的L1里記錄state值的緩存塊的數(shù)據(jù)false刷新到主內(nèi)存,并修改該緩存塊的狀態(tài)為shared倚喂。CPU2則從主內(nèi)存中讀取更新后的statefalse到L1的一個(gè)緩存塊每篷,記錄該緩存塊的狀態(tài)為shared;
  6. 線程2釋放鎖端圈,線程3獲取鎖焦读;線程3釋放鎖,線程4獲得鎖枫笛;線程4釋放鎖都是在重復(fù)步驟4和步驟5

案例二:ArrayLock(有界隊(duì)列鎖)帶來(lái)的緩存一致性風(fēng)暴優(yōu)化

Array-Lock-1.png

情形一:假定boolean數(shù)據(jù)占據(jù)1個(gè)字節(jié)吨灭,一個(gè)CPU執(zhí)行一個(gè)線程,此時(shí)的緩存一致風(fēng)暴量跟TAS鎖一樣刑巧,就不做討論了

情形二:假定boolean數(shù)據(jù)占據(jù)1個(gè)字節(jié)喧兄,2個(gè)CPU,4個(gè)線程:CPU1執(zhí)行線程T1啊楚、T3吠冤,CPU2執(zhí)行線程T2、T4恭理,

  1. 當(dāng)線程T1在CPU1上執(zhí)行while(!flags[0]){}時(shí)拯辙,會(huì)一次讀取8個(gè)字節(jié)的數(shù)據(jù)到L1的一個(gè)緩存塊中,并標(biāo)記該緩存塊的狀態(tài)為exclusive
  2. 當(dāng)線程T2在CPU2上執(zhí)行while(!flags[1]){}時(shí)涯保,CPU1檢測(cè)到地址沖突诉濒,如果L1中存儲(chǔ)flags[1]值的緩存塊的狀態(tài)已經(jīng)是shared,則不做操作夕春;否則將L1存儲(chǔ)flags[1]值的緩存塊的狀態(tài)修改為shared未荒;CPU2會(huì)一次讀取8個(gè)字節(jié)的數(shù)據(jù)到高速緩存L2的一個(gè)緩存塊中,并標(biāo)記該緩存塊的狀態(tài)為shared及志;
  3. 當(dāng)線程T3在CPU1上執(zhí)行while(!flags[2]){}時(shí)片排,由于在步驟1中已經(jīng)加載了flags[2]的數(shù)據(jù),所以讀命中速侈,此時(shí)L1中記錄flags[2]的狀態(tài)為shared率寡;
  4. 當(dāng)線程T4在CPU2上執(zhí)行while(!flags[3]){}時(shí),由于在步驟1中已經(jīng)加載了flags[3]的數(shù)據(jù)倚搬,所以讀命中冶共,此時(shí)L2中記錄flags[3]的狀態(tài)為shared
  5. 當(dāng)線程1在CPU1執(zhí)行flags[0]=false;flags[1]=true時(shí)每界,則將flags[0]和flags[1]所在的緩存塊的狀態(tài)改為modified,并發(fā)起“修改各自記錄共享數(shù)據(jù)的緩存塊的狀態(tài)為invalid”的廣播請(qǐng)求比默。CPU2收到該廣播請(qǐng)求后,就將各自高速緩存中記錄共享數(shù)據(jù)的緩存塊的狀態(tài)為invalid盆犁;
  6. 線程2在CPU2執(zhí)行while(!flags[1]){}時(shí),發(fā)現(xiàn)高速緩存L2中記錄flags[1]的緩存塊的狀態(tài)為invalid篡九,則就發(fā)起“從主內(nèi)存中讀取數(shù)據(jù)”的廣播請(qǐng)求谐岁,此時(shí)CPU1就把L1記錄的flag[1]所在的緩存塊的數(shù)據(jù)刷新到主內(nèi)存,并記錄該緩存塊的狀態(tài)改為shared榛臼;CPU2從主內(nèi)存中重新讀取flags[1]的數(shù)據(jù)到L2的一個(gè)緩存行伊佃,并記錄該緩存行的狀態(tài)為shared
  7. 當(dāng)線程2在CPU2上執(zhí)行flags[1]=false;flags[2]=true時(shí),則將flags[1]和flags[2]所在的緩存塊的狀態(tài)改為modified,并發(fā)起“修改各自記錄共享數(shù)據(jù)的緩存塊的狀態(tài)為invalid”的廣播請(qǐng)求沛善。CPU1收到該廣播請(qǐng)求后航揉,就將各自高速緩存中記錄共享數(shù)據(jù)的緩存塊的狀態(tài)為invalid
  8. 線程3在CPU1執(zhí)行while(!flags[2]){}時(shí)金刁,發(fā)現(xiàn)高速緩存L2中記錄flags[2]的緩存塊的狀態(tài)為invalid帅涂,則就發(fā)起“從主內(nèi)存中讀取數(shù)據(jù)”的廣播請(qǐng)求,此時(shí)CPU2就把L2記錄的flag[2]所在的緩存塊的數(shù)據(jù)刷新到主內(nèi)存尤蛮,并記錄該緩存塊的狀態(tài)改為shared媳友;CPU1從主內(nèi)存中重新讀取flags[2]的數(shù)據(jù)到L1的一個(gè)緩存行,并記錄該緩存行的狀態(tài)為shared

參考資料

  1. 《The Art of Multi-Processor Programming》
  2. 聊聊高并發(fā)(三十四)Java內(nèi)存模型那些事(二)理解CPU高速緩存的工作原理
    http://blog.csdn.net/iter_zc/article/details/41979189
  3. 聊聊高并發(fā)(五)理解緩存一致性協(xié)議以及對(duì)并發(fā)編程的影響
    http://blog.csdn.net/iter_zc/article/details/40342695
最后編輯于
?著作權(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)離奇詭異,居然都是意外死亡赶促,警方通過(guò)查閱死者的電腦和手機(jī)液肌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芳杏,“玉大人矩屁,你說(shuō)我怎么就攤上這事【粽裕” “怎么了吝秕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)空幻。 經(jīng)常有香客問(wèn)我烁峭,道長(zhǎng),這世上最難降的妖魔是什么秕铛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任约郁,我火速辦了婚禮,結(jié)果婚禮上但两,老公的妹妹穿的比我還像新娘鬓梅。我一直安慰自己,他們只是感情好谨湘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布绽快。 她就那樣靜靜地躺著,像睡著了一般紧阔。 火紅的嫁衣襯著肌膚如雪坊罢。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天擅耽,我揣著相機(jī)與錄音活孩,去河邊找鬼。 笑死乖仇,一個(gè)胖子當(dāng)著我的面吹牛憾儒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乃沙,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼航夺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了崔涂?” 一聲冷哼從身側(cè)響起阳掐,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后缭保,有當(dāng)?shù)厝嗽跇?shù)林里發(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
  • 文/蒙蒙 一巩检、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧示启,春花似錦兢哭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至啤月,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劳跃,已是汗流浹背谎仲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(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)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,303評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理轻抱,服務(wù)發(fā)現(xiàn)飞涂,斷路器,智...
    卡卡羅2017閱讀 134,704評(píng)論 18 139
  • 本文是RAD Game Tools程序員Fabian “ryg” Giesen在其博客上發(fā)表的《Cache coh...
    kneep閱讀 1,875評(píng)論 1 13
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司较店,掛了不少士八,但最終還是拿到小米、百度梁呈、阿里婚度、京東、新浪官卡、CVTE蝗茁、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,277評(píng)論 11 349
  • 親愛(ài)的Z: 我們認(rèn)識(shí)多久了呢?一年寻咒,兩年哮翘,三年半,從夏末到冬初仔涩,從青澀到成熟忍坷。 三年半,聽(tīng)起來(lái)很長(zhǎng)熔脂,過(guò)起來(lái)很短佩研。你...
    妖孽馮二狗閱讀 2,740評(píng)論 1 1