當前位置:編程學習大全網 - 編程語言 - 驗證Cache Miss的存在

驗證Cache Miss的存在

[toc]

本地旨在驗證在《深入刨析volatile關鍵詞》中提到的CPU Cache中緩存壹致性協議可能會出現的CacheMiss;

緩存是由緩存行組成的。壹般壹行緩存行有64字節。CPU在操作緩存時是以緩存行為單位的,可以通過如下命令查看緩存行的大小:

由於CPU存取緩存都是按行為最小單位操作的。對於long類型來說,壹個long類型的數據有64位,也就是8個字節,所以對於數組來說,由於數組中元素的地址是連續的,所以在加載數組中第壹個元素的時候會把後面的元素也加載到緩存行中。如果壹個long類型的數組長度是8,那麽也就是64個字節了,CPU這時操作該數組,似乎應該會把數組中所有的元素都放入緩存行,但是答案卻是否定的,原因就是在Java中,對象在內存中的結構包含對象頭。在《深入剖析synchronized關鍵詞》壹個對象的內存布局小節 有相關描述;

壹張經典的Cache Line

壹個運行在處理器core 1上的線程想要更新變量X的值, 同時另外壹個運行在處理器core 2上的線程想要更新變量Y的值. 但是, 這兩個頻繁改動的變量都處於同壹條緩存行. 兩個線程就會輪番發送RFO消息, 占得此緩存行的擁有權. 當core 1取得了擁有權開始更新X, 則core 2對應的緩存行需要設為I狀態. 當core 2取得了擁有權開始更新Y, 則core 1對應的緩存行需要設為I狀態(失效態). 輪番奪取擁有權不但帶來大量的RFO消息, 而且如果某個線程需要讀此行數據時, L1和L2緩存上都是失效數據, 只有L3緩存上是同步好的數據;而L3的Cache性能不好;

先看結果

參考文檔寫的比我好,想了解更多,請移步到參考連接文章。

從Java視角理解偽***享(False Sharing)

從Java視角理解CPU緩存(CPU Cache)

理解CPU-Cache

打賞地址

  • 上一篇:山西哪些行業好就業?
  • 下一篇:用java編程遊戲
  • copyright 2024編程學習大全網