中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中偽共享的示例分析

發布時間:2021-06-09 14:37:51 來源:億速云 閱讀:161 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關C++中偽共享的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

前言

在多核并發編程中,如果將互斥鎖的爭用比作“性能殺手”的話,那么偽共享則相當于“性能刺客”。“殺手”與“刺客”的區別在于殺手是可見的,遇到殺手時我們可以選擇戰斗、逃跑、繞路、求饒等多種手段去應付,但“刺客”卻不同,“刺客”永遠隱藏在暗處,伺機給你致命一擊,防不勝防。具體到我們的并發編程中,遇到鎖爭用影響并發性能情況時,我們可以采取多種措施(如縮短臨界區,原子操作等等)去提高程序性能,但是偽共享卻是我們從所寫代碼中看不出任何蛛絲馬跡的,發現不了問題也就無法解決問題,從而導致偽共享在“暗處”嚴重拖累程序的并發性能,但我們卻束手無策。

緩存行

為了進行下面的討論,我們需要首先熟悉緩存行的概念,學過操作系統課程存儲結構這部分內容的同學應該對存儲器層次結構的金字塔模型印象深刻,金字塔從上往下代表存儲介質的成本降低、容量變大,從下往上則代表存取速度的提高。位于金字塔模型最上層的是CPU中的寄存器,其次是CPU緩存(L1,L2,L3),再往下是內存,最底層是磁盤,操作系統采用這種存儲層次模型主要是為了解決CPU的高速與內存磁盤低速之間的矛盾,CPU將最近使用的數據預先讀取到Cache中,下次再訪問同樣數據的時候,可以直接從速度比較快的CPU緩存中讀取,避免從內存或磁盤讀取拖慢整體速度。

CPU緩存的最小單位就是緩存行,緩存行大小依據架構不同有不同大小,最常見的有64Byte和32Byte,CPU緩存從內存取數據時以緩存行為單位進行,每一次都取需要讀取數據所在的整個緩存行,即使相鄰的數據沒有被用到也會被緩存到CPU緩存中(這里又涉及到局部性原理,后面文章會進行介紹)。

緩存一致性

在單核CPU情況下,上述方法可以正常工作,可以確保緩存到CPU緩存中的數據永遠是“干凈”的,因為不會有其他CPU去更改內存中的數據,但是在多核CPU下,情況就變得更加復雜一些。多CPU中,每個CPU都有自己的私有緩存(可能共享L3緩存),當一個CPU1對Cache中緩存數據進行操作時,如果CPU2在此之前更改了該數據,則CPU1中的數據就不再是“干凈”的,即應該是失效數據,緩存一致性就是為了保證多CPU之間的緩存一致。

Linux系統中采用MESI協議處理緩存一致性,所謂MESI即是指CPU緩存的四種狀態:

  • M(修改,Modified):本地處理器已經修改緩存行,即是臟行,它的內容與內存中的內容不一樣,并且此 cache 只有本地一個拷貝(專有);

  • E(專有,Exclusive):緩存行內容和內存中的一樣,而且其它處理器都沒有這行數據;

  • S(共享,Shared):緩存行內容和內存中的一樣, 有可能其它處理器也存在此緩存行的拷貝;

  • I(無效,Invalid):緩存行失效, 不能使用。

每個CPU緩存行都在四個狀態之間互相轉換,以此決定CPU緩存是否失效,比如CPU1對一個緩存行執行了寫入操作,則此操作會導致其他CPU的該緩存行進入Invalid無效狀態,CPU需要使用該緩存行的時候需要從內存中重新讀取。由此就解決了多CPU之間的緩存一致性問題。

偽共享

何謂偽共享?上面我們提過CPU的緩存是以緩存行為單位進行的,即除了本身所需讀寫的數據之外還會緩存與該數據在同一緩存行的數據,假設緩存行大小是32字節,內存中有“abcdefgh”八個int型數據,當CPU讀取“d”這個數據時,CPU會將“abcdefgh”八個int數據組成一個緩存行加入到CPU緩存中。假設計算機有兩個CPU:CPU1和CPU2,CPU1只對“a”這個數據進行頻繁讀寫,CPU2只對“b”這個數據進行頻繁讀寫,按理說這兩個CPU讀寫數據沒有任何關聯,也就不會產生任何競爭,不會有性能問題,但是由于CPU緩存是以緩存行為單位進行存取的,也是以緩存行為單位失效的,即使CPU1只更改了緩存行中“a”數據,也會導致CPU2中該緩存行完全失效,同理,CPU2對“b”的改動也會導致CPU1中該緩存行失效,由此引發了該緩存行在兩個CPU之間“乒乓”,緩存行頻繁失效,最終導致程序性能下降,這就是偽共享。

如何避免偽共享

避免偽共享主要有以下兩種方式:

1.緩存行填充(Padding):為了避免偽共享就需要將可能造成偽共享的多個變量處于不同的緩存行中,可以采用在變量后面填充字節的方式達到該目的。

2.使用某些語言或編譯器中強制變量對齊,將變量都對齊到緩存行大小,避免偽共享發生。

關于“C++中偽共享的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

新乡市| 天祝| 罗源县| 宣威市| 昌吉市| 三江| 道孚县| 如东县| 曲沃县| 富源县| 漯河市| 呼图壁县| 襄樊市| 嘉黎县| 彩票| 依安县| 遂宁市| 万源市| 南充市| 兴宁市| 毕节市| 井冈山市| 汉寿县| 剑阁县| 咸丰县| 寿宁县| 香河县| 开阳县| 永丰县| 广河县| 丹江口市| 临海市| 屏山县| 连城县| 六枝特区| 扬州市| 祁阳县| 双柏县| 香港| 赫章县| 陇西县|