精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

字節面:什么是偽共享?

開發 前端
周末的時候,有個讀者跟我說,面試字節的時候被問到:「什么是偽共享?又該怎么避免偽共享的問題?」這個其實是考察 CPU 緩存的問題,我之前的圖解系統也有提到過。

 

本文轉載自微信公眾號「小林coding」,作者小林coding 。轉載本文請聯系小林coding公眾號。

大家好,我是小林。

周末的時候,有個讀者跟我說,面試字節的時候被問到:「什么是偽共享?又該怎么避免偽共享的問題?」

這個其實是考察 CPU 緩存的問題,我之前的圖解系統也有提到過。

今天,我再跟大家講一下。

正文

CPU 如何讀寫數據的?

先來認識 CPU 的架構,只有理解了 CPU 的 架構,才能更好地理解 CPU 是如何讀寫數據的,對于現代 CPU 的架構圖如下:

可以看到,一個 CPU 里通常會有多個 CPU 核心,比如上圖中的 1 號和 2 號 CPU 核心,并且每個 CPU 核心都有自己的 L1 Cache 和 L2 Cache,而 L1 Cache 通常分為 dCache(數據緩存) 和 iCache(指令緩存),L3 Cache 則是多個核心共享的,這就是 CPU 典型的緩存層次。

上面提到的都是 CPU 內部的 Cache,放眼外部的話,還會有內存和硬盤,這些存儲設備共同構成了金字塔存儲層次。如下圖所示:

從上圖也可以看到,從上往下,存儲設備的容量會越大,而訪問速度會越慢。至于每個存儲設備的訪問延時,你可以看下圖的表格:

你可以看到, CPU 訪問 L1 Cache 速度比訪問內存快 100 倍,這就是為什么 CPU 里會有 L1~L3 Cache 的原因,目的就是把 Cache 作為 CPU 與內存之間的緩存層,以減少對內存的訪問頻率。

CPU 從內存中讀取數據到 Cache 的時候,并不是一個字節一個字節讀取,而是一塊一塊的方式來讀取數據的,這一塊一塊的數據被稱為 CPU Line(緩存行),所以 CPU Line 是 CPU 從內存讀取數據到 Cache 的單位。

至于 CPU Line 大小,在 Linux 系統可以用下面的方式查看到,你可以看我服務器的 L1 Cache Line 大小是 64 字節,也就意味著 L1 Cache 一次載入數據的大小是 64 字節。

那么對數組的加載, CPU 就會加載數組里面連續的多個數據到 Cache 里,因此我們應該按照物理內存地址分布的順序去訪問元素,這樣訪問數組元素的時候,Cache 命中率就會很高,于是就能減少從內存讀取數據的頻率, 從而可提高程序的性能。

但是,在我們不使用數組,而是使用單獨的變量的時候,則會有 Cache 偽共享的問題,Cache 偽共享問題上是一個性能殺手,我們應該要規避它。

接下來,就來看看 Cache 偽共享是什么?又如何避免這個問題?

現在假設有一個雙核心的 CPU,這兩個 CPU 核心并行運行著兩個不同的線程,它們同時從內存中讀取兩個不同的數據,分別是類型為 long 的變量 A 和 B,這個兩個數據的地址在物理內存上是連續的,如果 Cahce Line 的大小是 64 字節,并且變量 A 在 Cahce Line 的開頭位置,那么這兩個數據是位于同一個 Cache Line 中,又因為 CPU Line 是 CPU 從內存讀取數據到 Cache 的單位,所以這兩個數據會被同時讀入到了兩個 CPU 核心中各自 Cache 中。

我們來思考一個問題,如果這兩個不同核心的線程分別修改不同的數據,比如 1 號 CPU 核心的線程只修改了 變量 A,或 2 號 CPU 核心的線程的線程只修改了變量 B,會發生什么呢?

分析偽共享的問題

現在我們結合保證多核緩存一致的 MESI 協議,來說明這一整個的過程,如果你還不知道 MESI 協議,你可以看我這篇文章「10 張圖打開 CPU 緩存一致性的大門」。

①. 最開始變量 A 和 B 都還不在 Cache 里面,假設 1 號核心綁定了線程 A,2 號核心綁定了線程 B,線程 A 只會讀寫變量 A,線程 B 只會讀寫變量 B。

②. 1 號核心讀取變量 A,由于 CPU 從內存讀取數據到 Cache 的單位是 Cache Line,也正好變量 A 和 變量 B 的數據歸屬于同一個 Cache Line,所以 A 和 B 的數據都會被加載到 Cache,并將此 Cache Line 標記為「獨占」狀態。

③. 接著,2 號核心開始從內存里讀取變量 B,同樣的也是讀取 Cache Line 大小的數據到 Cache 中,此 Cache Line 中的數據也包含了變量 A 和 變量 B,此時 1 號和 2 號核心的 Cache Line 狀態變為「共享」狀態。

④. 1 號核心需要修改變量 A,發現此 Cache Line 的狀態是「共享」狀態,所以先需要通過總線發送消息給 2 號核心,通知 2 號核心把 Cache 中對應的 Cache Line 標記為「已失效」狀態,然后 1 號核心對應的 Cache Line 狀態變成「已修改」狀態,并且修改變量 A。

⑤. 之后,2 號核心需要修改變量 B,此時 2 號核心的 Cache 中對應的 Cache Line 是已失效狀態,另外由于 1 號核心的 Cache 也有此相同的數據,且狀態為「已修改」狀態,所以要先把 1 號核心的 Cache 對應的 Cache Line 寫回到內存,然后 2 號核心再從內存讀取 Cache Line 大小的數據到 Cache 中,最后把變量 B 修改到 2 號核心的 Cache 中,并將狀態標記為「已修改」狀態。

所以,可以發現如果 1 號和 2 號 CPU 核心這樣持續交替的分別修改變量 A 和 B,就會重復 ④ 和 ⑤ 這兩個步驟,Cache 并沒有起到緩存的效果,雖然變量 A 和 B 之間其實并沒有任何的關系,但是因為同時歸屬于一個 Cache Line ,這個 Cache Line 中的任意數據被修改后,都會相互影響,從而出現 ④ 和 ⑤ 這兩個步驟。

因此,這種因為多個線程同時讀寫同一個 Cache Line 的不同變量時,而導致 CPU Cache 失效的現象稱為偽共享(False Sharing)。

避免偽共享的方法

因此,對于多個線程共享的熱點數據,即經常會修改的數據,應該避免這些數據剛好在同一個 Cache Line 中,否則就會出現為偽共享的問題。

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

在 Linux 內核中存在 __cacheline_aligned_in_smp 宏定義,是用于解決偽共享的問題。

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

  • 如果在多核(MP)系統里,該宏定義是 __cacheline_aligned,也就是 Cache Line 的大小;
  • 而如果在單核系統里,該宏定義是空的;

因此,針對在同一個 Cache Line 中的共享的數據,如果在多核之間競爭比較嚴重,為了防止偽共享現象的發生,可以采用上面的宏定義使得變量在 Cache Line 里是對齊的。

舉個例子,有下面這個結構體:

結構體里的兩個成員變量 a 和 b 在物理內存地址上是連續的,于是它們可能會位于同一個 Cache Line 中,如下圖:

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

這樣 a 和 b 變量就不會在同一個 Cache Line 中了,如下圖:

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

我們再來看一個應用層面的規避方案,有一個 Java 并發框架 Disruptor 使用「字節填充 + 繼承」的方式,來避免偽共享的問題。

Disruptor 中有一個 RingBuffer 類會經常被多個線程使用,代碼如下:

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

我們都知道,CPU Cache 從內存讀取數據的單位是 CPU Line,一般 64 位 CPU 的 CPU Line 的大小是 64 個字節,一個 long 類型的數據是 8 個字節,所以 CPU 一下會加載 8 個 long 類型的數據。

根據 JVM 對象繼承關系中父類成員和子類成員,內存地址是連續排列布局的,因此 RingBufferPad 中的 7 個 long 類型數據作為 Cache Line 前置填充,而 RingBuffer 中的 7 個 long 類型數據則作為 Cache Line 后置填充,這 14 個 long 變量沒有任何實際用途,更不會對它們進行讀寫操作。

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

 

責任編輯:武曉燕 來源: 小林coding
相關推薦

2021-03-01 11:53:15

面試偽共享CPU

2021-06-30 17:38:03

Trie 樹字符Java

2024-07-30 14:01:51

Java字節碼JVM?

2025-03-28 10:47:05

開發注解Java

2024-08-30 08:59:15

2025-08-05 03:22:00

2025-04-08 09:20:00

Sentinel限流微服務

2019-12-17 14:24:11

CPU緩存偽共享

2017-07-13 16:40:16

偽共享緩存行存儲

2022-12-12 08:39:09

CPUCache偽共享

2021-04-25 09:58:48

mmapJava面試

2021-03-17 15:54:32

IO零拷貝方式

2024-11-26 08:52:34

SQL優化Kafka

2013-06-14 10:12:22

共享并行

2021-11-18 08:55:49

共享CPU內存

2022-03-30 10:10:17

字節碼棧空間

2015-04-23 09:34:51

Windows開源

2023-12-26 16:14:43

2017-08-23 13:21:31

2021-09-08 07:58:58

字節系統雙寫
點贊
收藏

51CTO技術棧公眾號

久久婷婷蜜乳一本欲蜜臀| 91九色综合| www久久精品| 国产女精品视频网站免费| 麻豆视频在线免费看| www.成人网| 欧美在线你懂的| 麻豆视频传媒入口| 午夜视频福利在线观看| 精品在线一区二区三区| 国产+人+亚洲| 日本伦理一区二区三区| 加勒比久久高清| 在线一区二区三区做爰视频网站| 特级西西人体www高清大胆| 亚洲av毛片成人精品| 精品写真视频在线观看| 91精品国产一区| 三级全黄做爰视频| 亚洲另类av| 欧美成人伊人久久综合网| 国产成人久久777777| 性欧美高清come| 国产女主播视频一区二区| 国产伦理久久久| 91麻豆一区二区| 男女精品视频| 国内精久久久久久久久久人| 99热99这里只有精品| 欧美综合精品| 精品国产一二三| 午夜av中文字幕| 素人啪啪色综合| 色综合天天综合在线视频| 国产九色porny| 国产cdts系列另类在线观看| 久久影院午夜论| 国产精品一国产精品最新章节| 97精品久久人人爽人人爽| 老牛嫩草一区二区三区日本| 欧美国产第二页| 欧美人禽zoz0强交| 偷偷www综合久久久久久久| 亚洲人成网站777色婷婷| 奇米777第四色| 一区中文字幕电影| 日韩欧美中文一区| 精品人妻一区二区三区免费| 99视频这里有精品| 7777精品伊人久久久大香线蕉 | 精品中文字幕久久久久久| 亚洲欧美激情一区二区三区| 狂野欧美xxxx韩国少妇| 91麻豆精品91久久久久久清纯| 日本激情综合网| 欧美91在线|欧美| 欧美三区在线观看| 中文字幕第88页| 国产精品无码久久久久| 欧美伊人精品成人久久综合97| 虎白女粉嫩尤物福利视频| 黄色在线网站噜噜噜| 欧美日韩亚洲国产一区| 毛片一区二区三区四区| 欧美日韩视频免费观看| 欧美中文字幕亚洲一区二区va在线 | 中文字幕乱妇无码av在线| 日本综合精品一区| 欧美精品一区二区精品网| 在线精品一区二区三区| 国产成人三级| 久久精品电影网站| 精国产品一区二区三区a片| 国产精品国码视频| 欧美一级片一区| 日本中文字幕在线观看视频| 美女久久久精品| 91深夜福利视频| 成人黄色在线观看视频| 本田岬高潮一区二区三区| 久久精品成人一区二区三区蜜臀| 青梅竹马是消防员在线| 国产精品毛片高清在线完整版| 国产奶头好大揉着好爽视频| 成人高潮aa毛片免费| 欧美日韩国产一中文字不卡 | 国产系列精品av| 久久精品日产第一区二区 | 自慰无码一区二区三区| jizz久久久久久| 91精品国产色综合久久不卡电影| 2一3sex性hd| 欧美色图在线播放| 欧美激情精品在线| 亚洲综合图片网| 激情都市一区二区| 美女精品国产| 91香蕉在线观看| 色偷偷成人一区二区三区91| 色乱码一区二区三区在线| 欧美成a人免费观看久久| 欲色天天网综合久久| 一区二区视频免费看| 午夜影院日韩| 国产v亚洲v天堂无码| 国产精品无码2021在线观看| 亚洲一区在线观看免费观看电影高清 | 国产日本精品| 国产噜噜噜噜噜久久久久久久久 | 色青青草原桃花久久综合| 国产精品.www| 精品亚洲aⅴ乱码一区二区三区| 久久riav二区三区| 欧美aaa免费| 欧美日韩国产美女| 久久国产精品影院| 激情六月综合| 成人欧美在线视频| 成人高清免费在线播放| 五月婷婷欧美视频| 久久发布国产伦子伦精品| 久久精品99久久无色码中文字幕| 97国产精品视频人人做人人爱| 国产男女无套免费网站| 国产日韩欧美一区二区三区综合| 91免费黄视频| 1204国产成人精品视频| xxx成人少妇69| 中文字幕乱码视频| 久久蜜桃一区二区| 日韩中文字幕三区| 欧美成人专区| 88国产精品欧美一区二区三区| 国语对白做受69按摩| 久久综合九色综合97婷婷女人| 少妇人妻大乳在线视频| 亚洲一区 二区| 久久国产精品网站| 国产免费一区二区三区最新不卡 | 少妇高潮久久77777| 国产女主播喷水视频在线观看| 99久久精品国产观看| 男人天堂手机在线视频| 亚洲一区二区三区中文字幕在线观看| 久久精品亚洲精品| 91丨九色丨蝌蚪丨对白| 中文字幕中文在线不卡住| 亚洲这里只有精品| 欧美成人激情| 成人免费视频网址| 免费a级毛片在线播放| 欧日韩精品视频| 中文字幕伦理片| 青青草一区二区三区| 亚洲精品视频一区二区三区| 成人深夜福利| 精品国产一区二区在线| 国产欧美综合视频| 一二三区精品视频| 污污免费在线观看| 午夜一区不卡| 午夜精品视频在线观看一区二区| www.一区| 久久综合亚洲社区| 黄色av免费观看| 天天操天天综合网| 在线观看日本中文字幕| 免费看精品久久片| 欧美另类videos| 草草视频在线一区二区| 69av成年福利视频| 精品欧美不卡一区二区在线观看| 日本道精品一区二区三区| 国产一区二区三区四区在线| 韩国女主播成人在线| 日韩精品在线中文字幕| 日本成人中文| 国产精品日韩电影| 毛片网站在线看| 亚洲欧美日韩在线高清直播| 亚洲一区二区天堂| 亚洲国产日韩一区二区| 制服 丝袜 综合 日韩 欧美| 国产一区二区三区在线观看免费视频| 日韩精品一区二区免费| 夜夜躁狠狠躁日日躁2021日韩| 国产一区二区在线免费视频| 电影k8一区二区三区久久| 国产亚洲aⅴaaaaaa毛片| 国内老熟妇对白xxxxhd| 欧美视频在线观看免费| 肉色超薄丝袜脚交69xx图片| 丁香啪啪综合成人亚洲小说 | 日本熟妇毛茸茸丰满| 国产女人18毛片水真多成人如厕 | 中文字幕第99页| 一区二区三区不卡视频| 女女互磨互喷水高潮les呻吟| 国产一区二区三区免费观看| 国产精品一区二区免费在线观看| 日韩理论电影| 久久精品欧美| 一区二区三区四区高清视频 | 日本欧美高清| 91黄色精品| 欧美日韩国产网站| 91精品国产91久久久久久| 免费黄色在线网站| 精品夜色国产国偷在线| 精品黑人一区二区三区国语馆| 一本一道综合狠狠老| 久草中文在线视频| 国产精品九色蝌蚪自拍| 无码熟妇人妻av| 国产白丝精品91爽爽久久| jizz大全欧美jizzcom| 亚洲欧美网站| 日韩av三级在线| 欧美三级视频| 99久re热视频精品98| 不卡一区综合视频| 欧美一级片免费观看| 99久久人爽人人添人人澡| 91免费的视频在线播放| 日韩在线你懂得| 国产精品扒开腿爽爽爽视频| 华人av在线| 97超碰国产精品女人人人爽| 色女人在线视频| 欧美成年人在线观看| 中文日本在线观看| 中文字幕国产亚洲2019| 国产亚洲依依| 国产亚洲精品美女| 撸视在线观看免费视频| 日韩精品在线第一页| 午夜在线视频免费| 亚洲国产天堂久久国产91| 亚洲免费视频网| 精品国产第一区二区三区观看体验| 国产又粗又长又黄| 4438x亚洲最大成人网| 一二三四区视频| 欧美日韩国产三级| 国产毛片久久久久| 91精品国产综合久久久蜜臀粉嫩| 国产精品一区二区免费视频| 91 com成人网| 国产男女猛烈无遮挡| 日韩欧美另类在线| 国产77777| 亚洲国产三级网| 欧美午夜黄色| 国产亚洲欧洲黄色| 午夜视频在线免费观看| 久久综合免费视频影院| 日本h片在线观看| 国内精品伊人久久| 中文字幕资源网在线观看免费| 51精品在线观看| 影视一区二区三区| 国产精品一区二区三区成人| 成人在线啊v| 豆国产97在线| 亚洲日本三级| 亚洲欧洲精品一区二区| 在线中文字幕亚洲| 日韩中字在线观看| 丝袜国产日韩另类美女| 欧美国产日韩另类| 丁香婷婷综合色啪| 国产真实乱人偷精品人妻| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 中文字幕不卡三区视频| 国产精品中文在线| 日韩一区二区三区在线看| 久久亚洲午夜电影| 日韩成人精品一区二区| 欧美日韩激情四射| 亚洲欧美清纯在线制服| 日韩在线一区视频| av成人免费在线| 超碰97av在线| 亚洲一区二区欧美日韩| www.五月婷婷.com| 日韩欧美不卡在线观看视频| 手机看片福利在线观看| 日韩视频免费在线| 高端美女服务在线视频播放| 国产精品日日做人人爱| 国产91精品入| 亚洲一区二区三区乱码| 亚洲激情二区| 小明看看成人免费视频| 91色视频在线| 午夜免费激情视频| 日本久久一区二区| 国产a级免费视频| 国产视频精品一区二区三区| 黄色网址免费在线观看| 日本久久久久亚洲中字幕| 日韩国产在线不卡视频| 色一情一乱一伦一区二区三区| 欧美激情成人在线| 一区二区三区国产免费| 成人一区二区三区视频| 欧美88888| 91国偷自产一区二区三区成为亚洲经典 | 日韩一区二区三区高清| 影音先锋中文字幕一区| 97超碰人人爽| 欧美极品aⅴ影院| 男女啊啊啊视频| 日韩精品一区二区三区蜜臀 | 依依成人精品视频| 中国一区二区视频| 国产视频综合在线| 国产激情视频在线看| 999视频在线免费观看| 久久国产电影| www.com操| 国产欧美日韩中文久久| 国产成人免费观看视频 | 日本在线视频网| 国产成人高清激情视频在线观看| 精品淫伦v久久水蜜桃| 水蜜桃在线免费观看| 国产一区美女在线| 中文字幕无码日韩专区免费| 欧美三级三级三级| 国产尤物视频在线| 国产精品久久久久77777| 最新国产一区| 亚洲爆乳无码专区| 久久久国产综合精品女国产盗摄| 日韩欧美一级视频| 精品中文视频在线| 久久电影tv| 日产精品高清视频免费| 麻豆精品网站| av黄色在线免费观看| 色香蕉成人二区免费| 日本中文一区二区三区| 日韩免费观看av| 欧洲亚洲视频| 毛片在线播放视频| 99久久国产综合色|国产精品| 国产在线拍揄自揄拍| 精品国产免费久久| 国产探花视频在线观看| 国产精品乱码一区二区三区| 综合久久亚洲| 久久久久亚洲无码| 精品成人在线视频| 日本韩国一区| 国产精品免费一区| 我不卡神马影院| 少妇性l交大片7724com| 亚洲最新在线观看| 日韩一级中文字幕| 日本久久久久久| 大色综合视频网站在线播放| 91女神在线观看| 亚洲美女屁股眼交3| 免费观看黄一级视频| 欧洲一区二区视频| 成人情趣视频| 中文字幕avav| 午夜精品免费在线观看| 毛片免费在线观看| 91色在线视频| 在线综合亚洲| 久久午夜精品视频| 日韩午夜激情电影| 麻豆mv在线观看| 亚洲欧美国产不卡| 国产成人免费视频网站高清观看视频| 久草免费在线观看视频| 国产网站欧美日韩免费精品在线观看 | 伊人精品一区二区三区| 久久在线视频在线| 牛牛影视久久网| 欧美日韩亚洲自拍| 亚洲理论在线观看| 青青草在线播放| 92看片淫黄大片欧美看国产片| 亚洲国产第一| 超碰97av在线| 亚洲精品在线电影| 电影一区电影二区| www.成年人视频| 国产日韩精品久久久| 丰满少妇一级片| 国产精品精品久久久| 激情欧美亚洲| 亚洲国产精品一区二区久久hs| 精品国产露脸精彩对白| 精品久久99| 国产二区视频在线播放| 亚洲免费av在线|