一致性專題之cpu緩存一致性(一)

只要涉及到緩存的業務場景就必定會出現數據一致性問題。對於該問題,從微觀的角度來看cpu與內存之間創建了N級緩存來提升效率,從宏觀的角度來看分佈式存儲使用數據副本機制來提升數據的安全性和訪問效率,不一樣的業務場景解決的技術手段不一樣,本文主要討論cpu的緩存一致性問題。因爲對cpu內部結構的詳細狀況不熟,本文只會對核心的概念進行討論。緩存

經過cpu-z工具就能夠看到以下圖所示的內容:安全

        圖中顯示了cpu有3級緩存,其中一級緩存分爲數據緩存和指令緩存其他的只有數據緩存(至於爲何只有一級緩存有指令緩存本人暫不清楚),每級的緩存大小也不一樣而且數據緩存級別越高空間越小。緩存行大小(即line-size)都是64byte,組關聯(即way-set associative)數量也不一樣。現圍繞這些內容進行討論。分佈式

一、cpu在訪問內存數據時需將數據先加載到緩存中,而後從緩存中讀取,緩存行是內存與緩存進行數據交換的基本單位,在本人電腦中爲64字節。工具

二、當cpu讀取數據時如何知道在哪一個cache line中呢(注意這裏說的數據先當成1個字節算,而不要看成short、int、long等類型,後面會說明這個問題),有如下方法:blog

    (1)將內存按照cache line 大小即64byte爲一個數據塊,對於4Gb的內存能夠分爲個數據塊,對於每一個cache line而言會額外記錄當前訪問數據所屬數據塊的地址(暫時命名爲tag字段,長度爲26bit)。遍歷全部的cache line,而後將數據地址/64並與tag字段進行驗證是否相等,若是相等表示當前數據在該cache line 中,再對64取模就能讀取需訪問的數據。這種方法又叫全關聯映射很明顯在查找時比較耗時,可是因爲cache line只要有空閒就能填滿所以空間利用率較高;內存

    (2)將內存按照緩存大小進行分塊,好比按照一級數據緩存大小32kb進行劃分,4Gb的內存能夠分爲個塊,而後每一個塊再按照cache line的大小64byte劃分紅個緩存行,與全關聯不一樣,該方法中每一個內存數據所在的數據塊與緩存中的緩存行是一一對應的,不能像全關聯同樣,當有緩存行衝突的時候只要發現某個緩存行空閒就能夠把內存中的數據加載過去,也就是說該方法即便有緩存行空閒着也不能用。與全關聯同樣每一個緩存行須要額外的空間來記錄內存地址所屬的塊號和緩存行的行號,該方法又叫直接映射;ci

    (3)將緩存分紅8份則每份4kb,將內存按照4kb進行分塊,4Gb的內存能夠分爲個塊,而後每一個塊再按照cache line的大小64byte劃分紅個緩存行,該方法與直接映射法很像只是沒按照整個緩存大小進行劃分,所以一樣會出現緩存行衝突的問題,不一樣的是當發現第1份中的某個緩存行被佔用時,會將數據加載到第2份中同一個緩存行行號中,若是第2份也被佔用會依此類推到第3份中。這種方法又叫組關聯映射法其實是前兩種方法的整合。該方法也就是目前cpu使用的最普遍的方法。it

三、由組關聯法可知,當第8份也被佔用的時候就須要從1-8份裏替換一個cache line了,替換的策略有隨機替換法、先進先出替換法、最近最少被使用(簡稱LRU,經過記錄每一個cache line訪問的時間將長時間沒被訪問的替換掉,考慮的是時間局部性)、最不常常使用(簡稱LFU,經過記錄每一個cache line被訪問的次數,將次數最少的替換掉)。效率

相關文章
相關標籤/搜索