避免偽內(nèi)存

因此醋寝,對于多個線程共享的熱點數(shù)據(jù)搞挣,即經(jīng)常會修改的數(shù)據(jù)带迟,應(yīng)該避免這些數(shù)據(jù)剛好在同一個 Cache Line 中音羞,否則就會出現(xiàn)為偽共享的問題。

接下來仓犬,看看在實際項目中是用什么方式來避免偽共享的問題的。

在 Linux 內(nèi)核中存在?__cacheline_aligned_in_smp?宏定義,是用于解決偽共享的問題侦讨。

從上面的宏定義,我們可以看到:

如果在多核(MP)系統(tǒng)里翠语,該宏定義是?__cacheline_aligned,也就是 Cache Line 的大胁票摺肌括;

而如果在單核系統(tǒng)里,該宏定義是空的酣难;

因此谍夭,針對在同一個 Cache Line 中的共享的數(shù)據(jù),如果在多核之間競爭比較嚴(yán)重憨募,為了防止偽共享現(xiàn)象的發(fā)生紧索,可以采用上面的宏定義使得變量在 Cache Line 里是對齊的。

舉個例子菜谣,有下面這個結(jié)構(gòu)體:

結(jié)構(gòu)體里的兩個成員變量 a 和 b 在物理內(nèi)存地址上是連續(xù)的珠漂,于是它們可能會位于同一個 Cache Line 中,如下圖:

所以尾膊,為了防止前面提到的 Cache 偽共享問題媳危,我們可以使用上面介紹的宏定義,將 b 的地址設(shè)置為 Cache Line 對齊地址冈敛,如下:

這樣 a 和 b 變量就不會在同一個 Cache Line 中了

所以济舆,避免 Cache 偽共享實際上是用空間換時間的思想,浪費一部分 Cache 空間莺债,從而換來性能的提升滋觉。

我們再來看一個應(yīng)用層面的規(guī)避方案,有一個 Java 并發(fā)框架 Disruptor 使用「字節(jié)填充 + 繼承」的方式齐邦,來避免偽共享的問題椎侠。

Disruptor 中有一個 RingBuffer 類會經(jīng)常被多個線程使用

你可能會覺得 RingBufferPad 類里 7 個 long 類型的名字很奇怪,但事實上措拇,它們雖然看起來毫無作用我纪,但卻對性能的提升起到了至關(guān)重要的作用。

我們都知道丐吓,CPU Cache 從內(nèi)存讀取數(shù)據(jù)的單位是 CPU Cache Line浅悉,一般 64 位 CPU 的 CPU Cache Line 的大小是 64 個字節(jié),一個 long 類型的數(shù)據(jù)是 8 個字節(jié)券犁,所以 CPU 一下會加載 8 個 long 類型的數(shù)據(jù)术健。

根據(jù) JVM 對象繼承關(guān)系中父類成員和子類成員,內(nèi)存地址是連續(xù)排列布局的粘衬,因此 RingBufferPad 中的 7 個 long 類型數(shù)據(jù)作為 Cache Line?前置填充荞估,而 RingBuffer 中的 7 個 long 類型數(shù)據(jù)則作為 Cache Line?后置填充咳促,這 14 個 long 變量沒有任何實際用途,更不會對它們進(jìn)行讀寫操作勘伺。

另外跪腹,RingBufferFelds 里面定義的這些變量都是?final?修飾的,意味著第一次加載之后不會再修改飞醉, 又由于「前后」各填充了 7 個不會被讀寫的 long 類型變量冲茸,所以無論怎么加載 Cache Line,這整個 Cache Line 里都沒有會發(fā)生更新操作的數(shù)據(jù)缅帘,于是只要數(shù)據(jù)被頻繁地讀取訪問噪裕,就自然沒有數(shù)據(jù)被換出 Cache 的可能,也因此不會產(chǎn)生偽共享的問題股毫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膳音,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子铃诬,更是在濱河造成了極大的恐慌祭陷,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趣席,死亡現(xiàn)場離奇詭異兵志,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宣肚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門想罕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人霉涨,你說我怎么就攤上這事按价。” “怎么了笙瑟?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵楼镐,是天一觀的道長。 經(jīng)常有香客問我往枷,道長框产,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任错洁,我火速辦了婚禮秉宿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屯碴。我一直安慰自己描睦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布窿锉。 她就那樣靜靜地躺著酌摇,像睡著了一般膝舅。 火紅的嫁衣襯著肌膚如雪嗡载。 梳的紋絲不亂的頭發(fā)上窑多,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機(jī)與錄音洼滚,去河邊找鬼埂息。 笑死,一個胖子當(dāng)著我的面吹牛遥巴,可吹牛的內(nèi)容都是我干的千康。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼铲掐,長吁一口氣:“原來是場噩夢啊……” “哼拾弃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起摆霉,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤豪椿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后携栋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搭盾,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年婉支,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸯隅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡向挖,死狀恐怖蝌以,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情何之,我是刑警寧澤饼灿,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站帝美,受9級特大地震影響碍彭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悼潭,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一庇忌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舰褪,春花似錦皆疹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捎迫。三九已至,卻和暖如春表牢,著一層夾襖步出監(jiān)牢的瞬間窄绒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工崔兴, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留彰导,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓敲茄,卻偏偏與公主長得像位谋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子堰燎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

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