天天看點

多線程第三節_mesi

1 CPU高速緩存

1.1 cpu為什麼要有告訴緩存

1.1.1 帶有高速緩存的cpu執行流程
cpu為什麼要有告訴緩存
        CPU在摩爾定律的指導下以每18個月翻一番的速度在發展,然而記憶體和硬碟的發展速度遠遠不及CPU。這 就造成了高性能能的記憶體和硬碟價格及其昂貴。然而CPU的高度運算需要高速的資料。為了解決這個問
題,CPU廠商在CPU中内置了少量的高速緩存以解決I\O速度和CPU運算速度之間的不比對問題。 在CPU通路儲存設備時,無論是存取資料抑或存取指令,都趨于聚集在一片連續的區域中,這就被稱為局 部性原理      
時間局部性
        (Temporal Locality):如果一個資訊項正在被通路,那麼在近期它很可能還會被再次通路。 比如循環、遞歸、方法的反複調用等。      
空間局部性
        (Spatial Locality):如果一個存儲器的位置被引用,那麼将來他附近的位置也會被引用。 比如順序執行的代碼、連續建立的兩個對象、數組等。      
帶有高速緩存的CPU執行計算的流程
        1 程式以及資料加載到主記憶體
        2 指令和資料被加載到cpu告訴緩存
        3 cpu執行指令,把結果寫道高速緩存
        4 告訴緩存中的資料寫回主記憶體      
多線程第三節_mesi
多線程第三節_mesi

2 MESI

2.1 多核cpu多級緩存一緻性協定MESI

多核CPU的情況下有多個一級緩存,如何保證緩存内部資料的一緻,不讓系統資料混亂。這裡就引出了一個 一緻性的協定MESI。      
MESI協定緩存狀态
        MESI是指四種狀态的首字母。每個cache line 有四個狀态他們分别是M(修改) E(獨享,互斥) S(共享) I(無效)
        注意: 對于M和E狀态而言總是精确的,他們在和該緩存行的真正狀态是一緻的,而S狀态可能是非一緻的。如果 一個緩存将處于S狀态的緩存行廢棄了,而另一個緩存實際上可能已經獨享了該緩存行,但是該緩存卻不會 将該緩存行升遷為E狀态,這是因為其它緩存不會廣播他們廢棄掉該緩存行的通知,同樣由于緩存并沒有保 存該緩存行的copy的數量,是以(即使有這種通知)也沒有辦法确定自己是否已經獨享了該緩存行。 從上面的意義看來E狀态是一種投機性的優化:如果一個CPU想修改一個處于S狀态的緩存行,總線事務需 要将所有該緩存行的copy變成invalid狀态,而修改E狀态的緩存不需要使用總線事務。      
多線程第三節_mesi
多線程第三節_mesi

2.2 cpu切換狀态阻塞解決-存儲緩存(Store bufferes)

緩存的一緻性消息傳遞是要時間,這就使其切換時會産生延遲,當一個緩存被切換狀态時,其他緩存受到消息完成各自的切換并且發出回應消息這麼一長串時間中cpu都會等待所有緩存完成響應。可能會出現阻塞導緻各種性能和穩定性問題。      
cpu切換狀态阻塞解決-存儲緩存
        當你需要修改本地緩存中的一條資訊,必須将 I(無效)狀态通知到其他擁有該緩存資料的cpu緩存中,并且等待确認,這個過程會被阻塞處理,但是時間會特别長。是以引入存儲緩存      
store bufferes(存儲緩存)
        處理器把它想要寫入到貯存的值寫到緩存,然後去處理其他事情。當所有失效确認都介紹到,資料才會最終被送出,這麼做會有倆個風險
        1. 處理器會嘗試從存儲緩存中讀取值,但他還沒來的及進行送出。這個解決方案叫store forwarding,它使得加載的時候,如果有存儲緩存存在,就進行傳回。
        2. 儲存什麼時候完成,這個并沒有儲存
        3. 硬體記憶體模型,執行失效不是一個簡單的操作,他需要處理器處理,另外存儲緩存并不是無窮大,所有處理器有時需要等待失效确認的傳回,這倆個操作使得性能大幅度降低,為了應付這種情況。引入了失效隊列,約定如下:
        1) 對于所有收到invalidate請求,invalidate acknowlege 必須立刻發送
        2) invalidate并不會真正立刻執行,而是放到一個特殊隊列,在友善的時候才會執行
        3) 處理器不會發送任何消息給所處理的緩存條目,知道它處理invalidate。即使時這樣子處理器依然不知道什麼時候優化是被允許的,是以處理器講這個任務丢給了寫代碼的人,也就是記憶體屏障