快取行對齊

2021-10-20 12:49:04 字數 1688 閱讀 8449

快取記憶體控制器是針對資料塊,而不是位元組進行操作的。從程式設計的角度講,快取記憶體其實就是一組稱之為快取行(cache line)的固定大小的資料塊,其大小是以突發讀或者突發寫週期的大小

為基礎的。

快取基本上來說就是把後面的資料載入到離cpu自己進的地方,對於cpu來說,它是不會乙個位元組乙個位元組的載入的,因為這非常沒有效率,一般來說都是要一塊一塊的載入的,在cpu的快取技術中,這個術語叫「cacheline」(有的中文編譯成「快取行」),一般來說,乙個主流的cpu的cacheline是64bytes(也有的cpu用32bytes和128bytes),也就是16個32位的整型。也就是說,cpu從記憶體中撈資料上來的最小資料單位。

關於快取行介紹詳細可見:

由於乙個快取行是64位元組,所以我們設計如下**:

public

class

cachelinetest

private

static

volatile tclass[

] tclasses =

newtclass[2

];static

public

static

void

main

(string[

] args)

throws interruptedexception })

; thread thread2 =

newthread((

)->})

;final

long start = system.

nanotime()

; thread1.

start()

; thread2.

start()

; thread1.

join()

; thread2.

join()

; system.out.

println

((system.

nanotime()

- start)

/100_1000);}

}

當上面**內部類tclass不加上標記的那一行成員變數時,執行速度如下:

當加上時,執行速度如下:

由於快取行是64位元組,而乙個long型別為8位元組,當不加那一行**時,計算的總的位元組數為8+8=16位元組,所以這兩個變數在乙個快取行中。

於是這個快取行中就有資料1和資料2。

當兩個執行緒分別執行時,由於加了volatile關鍵字,執行緒1改變了快取行中的資料1,需要去通知執行緒2去更新快取行中的資料1(即使資料1執行緒2不需要用到),因此就降低了cpu的執行速度。

但是上面**如果加上

private volatile long a, b, c, d, e, f, g;
這時每個tclass有8個long型別的成員變數,即8 * 8 = 64個位元組,每個tclass都單獨在乙個快取行中。

因此兩個執行緒分別執行時都不需要通知對方,cpu執行速度就會增加。

CPU快取記憶體行對齊

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

JVM快取行對齊效能優化

快取是由多個快取行組成的,以快取行為基本單位,乙個快取行的大小一般為64位元組。因為快取行存在,當不同的執行緒在操作兩份不同的資料時,如果這兩份資料剛好位於同乙個快取行中,那麼彼此之間就會互相影響。所以為了解決偽共享的問題,就出現了快取行對齊的方式,也就是讓c d兩份資料分別獨佔乙個快取行,這樣就不...

TLB cahce 快取對齊

關於記憶體,總是少不了tlb,cache,buffer,最近有了點粗淺的概念理解。處理器為每個processor都分配了虛擬位址,具體的map方式可以通過 proc map 檢視程序的具體對映,這是通過mmu 記憶體管理單元 實現的。linux虛擬位址到實體地址的對映通過多級分頁方式 具體分級和體系...