多線程第三節_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 告訴緩存中的數據寫回主內存

1655437237048

1655437308148

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狀態的緩存不需要使用總線事務。

1655449122443

1655449179154

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

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

1655454109934

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章