slab為什麼要進行著色處理

2021-07-27 06:14:17 字數 1166 閱讀 9257

不了快取記憶體以及快取記憶體的讀取方式的先理解下。

這個部落格寫的比較詳細

大概的簡述一下,及cpu讀取記憶體裡的東西時,並不會直接去記憶體去讀取,這樣會導致讀取的資料很慢。cpu會到一級快取讀取所需要的資料,而一級快取則會去記憶體裡面讀取資料,讀取的方式是通過快取行(cache line)的形式來進行讀取。當一級快取內的資料需要置換時,則會將快取內的資料置換到二級快取內,然後依次類推到記憶體中。

假設我們的快取行為64位元組,512行(一共32k)。那麼32k的大小怎麼進行對幾百m或者幾g的記憶體進行對映呢?

快取記憶體讀物理記憶體的位置不是任意的,而是固定的。那麼就根據快取記憶體的大小進行對映,這裡是32k一組大小進行對映:

再假設: 我們讀取資料的記憶體實體地址是0x1000000,

則第0快取行就會固定的讀取0x1000000~0x1000040這64個位元組大小(即快取行大小),並且第0快取行並不能讀取0x1000040~0x1000080的資料,這個位址只能是第1快取行進行讀取的。第0快取行讀取的下乙個位址只能是0x1008000~0x1008040的資料,然後以此類推。

那麼現在已經可以解釋slab為啥要進行著色了:

比如cpu正在對0x10000008位址進行讀寫操作,突然有乙個位址指標指向了0x10008008,並且需要讀取0x10008008記憶體處的位址,cpu檢測到衝突,因為此時位於第0根快取行上的64個位元組資料有效位址空間是0x10000000~0x10000040,而另乙個位址段下的物理記憶體也需要使用第0根快取行,cpu執行寫回操作,將現在第0根快取行上的64位元組資料塊傳輸到物理記憶體0x10000000~0x10000040上,之後將0x10008000~0x10008040物理記憶體段上的64位元組資料,塊傳輸到第0快取行,這樣就完成了衝突之後的一次切換。

如果我們需要進行對這兩塊上面的資料分別交叉的讀取1000次,那麼我們需要進行對快取記憶體的不斷移除更新,而且讀取記憶體的速度遠遠的大於讀取快取的速度,那麼將會造成大量的時間消耗。

解決辦法就是將第二塊讀取的資料前加乙個偏移,讓它移到第1塊快取行上面,兩塊資料分別可以在快取行的0和1行上面進行讀取,那麼我們讀取資料的時候就不會造成不必要的資料交換。

著色即為新增偏移。

為什麼要進行認知公升級?

我們生活在乙個最好的時代,也生活在乙個最壞的時代。最好,是因為機會無限多。最壞,是因為到處人才擁擠。可是 只要你足夠好,上天就眷顧你。而我們作為乙個個體,想要獲得上天的垂憐,除了選擇去撞概率買彩票一夜暴富之外,唯一的方式有且只有一條 通過不斷成長,變得足夠好。一兩年前,我追女孩子琢磨出乙個真理,與某...

為什麼要進行介面測試?

1,什麼是介面?可以簡單理解成用來連線而開放的入口,比如前端和後端的連續需要用介面,移動端和後台的鏈結也需要用到介面。連線前端後端和移動端。2,介面都有哪些型別?介面一般分為兩種 1 程式內部的介面 2 系統對外的介面 系統對外的介面 比如你要從別的 或伺服器上獲取資源或資訊,別人肯定不會把資料庫共...

為什麼要進行版本控制

上圖是乙個cad設計師的施工 件夾,他需要修改原來的施工圖,但是他又不想把修改前的檔案狀態和內容給破壞掉,因為如果直接修改,萬一修改的有問題,或者後悔修改了,如果以前的檔案狀態還在的話,大不了把修改糟糕了的刪除了就是了,所以他其實就用到了最簡單的版本控制方法,那就是複製重新命名 具體寫程式的過程也是...