CPU快取記憶體行

2022-02-19 11:56:51 字數 1219 閱讀 1263

cpu

為了更快的執行**。於是當從記憶體中讀取資料時,並不是唯讀自己想要的部分。而是讀取足夠的位元組來填入快取記憶體行。根據不同的

cpu,快取記憶體行大小不同。如

x86是

32bytes

,而alpha

是64bytes

。並且始終在第

32個位元組或第

64個位元組處對齊。這樣,當

cpu訪問相鄰的資料時,就不必每次都從記憶體中讀取,提高了速度。

因為訪問記憶體要比訪問快取記憶體用的時間多得多。

但是,多核發達的年代。情況就不能那麼簡單了。試想下面這樣乙個情況。

1、cpu1

讀取了乙個位元組,以及它和它相鄰的位元組被讀入

cpu1

的快取記憶體。

2、cpu2

做了上面同樣的工作。這樣

cpu1

,cpu2

的快取記憶體擁有同樣的資料。

3、cpu1

修改了那個位元組,被修改後,那個位元組被放回

cpu1

的快取記憶體行。但是該資訊並沒有被寫入

ram。

4、cpu2

訪問該位元組,但由於

cpu1

並未將資料寫入

ram,導致了資料不同步。

為了解決這個問題,晶元設計者制定了乙個規則。當乙個

cpu修改快取記憶體行中的位元組時,計算機中的其它

cpu會被通知,它們的快取記憶體將視為無效。於是,在上面的情況下,

cpu2

發現自己的快取記憶體中資料已無效,

cpu1

將立即把自己的資料寫回

ram,然後

cpu2

重新讀取該資料。

可以看出,快取記憶體行在多處理器上會導致一些不利。

從上面的情況可以看出,在設計資料結構的時候,應該盡量將唯讀資料與讀寫資料分開,並具盡量將同一時間訪問的資料組合在一起。這樣

cpu能一次將需要的資料讀入。

如:struct __a

;這樣的資料結構就很不利。

在x86

下,可以試著修改和調整它

struct __a

;32 – sizeof(int)+sizeof(name)*sizeof(name[0])%32

看起來很不和諧,

32表示

x86中,快取記憶體行為

32bytes

大小。__align

用於顯式對齊。

CPU快取記憶體行

cpu 為了更快的執行 於是當從記憶體中讀取資料時,並不是唯讀自己想要的部分。而是讀取足夠的位元組來填入快取記憶體行。根據不同的 cpu,快取記憶體行大小不同。如 x86是 32bytes 而alpha 是64bytes 並且始終在第 32個位元組或第 64個位元組處對齊。這樣,當 cpu訪問相鄰的...

CPU快取記憶體行對齊

cpu的快取記憶體一般分為一級快取和二級快取,現今更多的cpu更是提供了 快取。cpu在執行時首先從一級快取讀取資料,如果讀取失敗則會從二級快取讀取資料,如果仍然失敗則再從記憶體中存讀取資料。而cpu從一級快取或二級快取或主記憶體中最終讀取到資料所耗費的時鐘週期差距是非常之大的。因此快取記憶體的容量...

總結 CPU快取記憶體

我們都知道,程式是由一條條指令和資料組成的,cpu在執行時的工作也是周而復始的執行一條條用途各異的指令。在一開始,程式載入到主存,在程式執行的過程中,將指令一條條的從主存中取出並執行,巨集觀上來說我們把主存看做是乙個很大的一維位元組陣列,位址即可看作為陣列的下標。這樣的結構可以確保程式可以順利執行。...