slab爲何要進行着色處理

大概的簡述一下,及cpu讀取內存裏的東西時,並不會直接去內存去讀取,這樣會致使讀取的數據很慢。cpu會到一級緩存讀取所須要的數據,而一級緩存則會去內存裏面讀取數據,讀取的方式是經過緩存行(cache line)的形式來進行讀取。當一級緩存內的數據須要置換時,則會將緩存內的數據置換到二級緩存內,而後依次類推到內存中。緩存

假設咱們的緩存行爲64字節,512行(一共32K)。那麼32K的大小怎麼進行對幾百M或者幾G的內存進行映射呢?指針

高速緩存讀物理內存的位置不是任意的,而是固定的。那麼就根據高速緩存的大小進行映射,這裏是32K一組大小進行映射:blog

image

再假設: 咱們讀取數據的內存物理地址是0x1000000,內存

則第0緩存行就會固定的讀取0x10000000x1000040這64個字節大小(即緩存行大小),而且第0緩存行並不能讀取0x10000400x1000080的數據,這個地址只能是第1緩存行進行讀取的。第0緩存行讀取的下一個地址只能是0x1008000~0x1008040的數據,而後以此類推。im

那麼如今已經能夠解釋slab爲啥要進行着色了:cpu

好比cpu正在對0x10000008地址進行讀寫操做,忽然有一個地址指針指向了0x10008008,而且須要讀取0x10008008內存處的地址,cpu檢測到衝突,由於此時位於第0根緩存行上的64個字節數據有效地址空間是0x100000000x10000040,而另外一個地址段下的物理內存也須要使用第0根緩存行,cpu執行寫回操做,將如今第0根緩存行上的64字節數據塊傳輸到物理內存0x100000000x10000040上,以後將0x10008000~0x10008040物理內存段上的64字節數據,塊傳輸到第0緩存行,這樣就完成了衝突以後的一次切換。數據

若是咱們須要進行對這兩塊上面的數據分別交叉的讀取1000次,那麼咱們須要進行對高速緩存的不斷移除更新,並且讀取內存的速度遠遠的大於讀取緩存的速度,那麼將會形成大量的時間消耗。img

解決辦法就是將第二塊讀取的數據前加一個偏移,讓它移到第1塊緩存行上面,兩塊數據分別能夠在緩存行的0和1行上面進行讀取,那麼咱們讀取數據的時候就不會形成沒必要要的數據交換。di

着色即爲添加偏移。時間

相關文章
相關標籤/搜索