2017-10-13 96 views
0

從導理解Linux內核第三版,章8.2.10,板噴漆的Linux slab分配器和高速緩存性能

我們從第2章知道,相同的硬件高速緩存行映射的許多不同的塊內存。在這個 一章中,我們也看到相同大小的對象最終被存儲在緩存中相同的偏移處。 在相同的緩存行中,具有相同偏移量的對象在相對較高的概率下最終會映射到 。因此,高速緩存硬件可能浪費存儲器週期,將來自同一高速緩存行的兩個對象 來回傳送到不同的RAM位置,而其他高速緩存行未充分利用。 板坯分配器試圖通過稱爲板坯着色的策略來減少這種令人不快的緩存行爲:不同的 稱爲顏色的任意值被分配給板坯。

enter image description here

(1)我無法理解的是,板着色試圖解決這個問題。當正常進程訪問數據時,如果它不在緩存中並且遇到緩存未命中,則將數據與來自進程嘗試訪問的數據的超出地址的數據一起提取到緩存中以提升性能。情況如何發生,以便相同的特定緩存行不斷交換?一個進程持續訪問兩個不同存儲區的內存區域內相同偏移量的兩個不同數據地址的概率非常低。即使發生,緩存策略通常會根據某些議程(例如LRU,隨機等)選擇要交換的行。不存在根據被訪問地址的最低有效位中的匹配來選擇排除行的策略。

(2)我無法理解板坯着色,這需要自由字節從板坯開始,與第一個對象不同的偏移不同磚的結果到底如何,解決高速緩存交換問題?

[求助]小調查後我相信我找到了我的問題的答案。回覆已發佈。

回答

0

我想我明白了,答案與相關性

緩存可以被劃分到某些集合,每一集合只能緩存特定存儲器塊中其類型。例如,set0將包含地址爲8的倍數的內存塊,set1將包含地址倍數爲12的內存塊。其原因是爲了提高緩存性能,以避免在整個緩存中搜索每個地址的情況。這種方式只需要搜索某個特定的緩存集合。現在

,從鏈接Understanding CPU Caching and performance

從Henessey和帕特森的377頁,緩存放置公式如下: (塊地址)MOD(套緩存數)

我們可以使用內存塊地址0x10000008(來自slabX,顏色爲C)和內存塊地址0x20000009(來自slabY,顏色爲Z)。對於大多數N(高速緩存中的集數),<address> MOD <N>的計算結果會產生不同的值,因此是用於緩存數據的不同集合。如果地址具有相同的最低有效位值(例如0x100000080x20000008),則對於N的大部分,計算結果將產生相同的值,因此塊將碰撞到相同的高速緩存集。

所以,通過保持一個不同的偏移(顏色),用於在不同的板坯的對象,將板坯的對象將有可能達到在高速緩存中的不同組並且將不碰撞到同一組,和整體的高速緩存性能是增加。

編輯:另外,如果高速緩存是一個直接映射的一個,則根據維基百科,CPU Cache,沒有高速緩存替換策略存在和modulu計算產生的存儲器塊將被存儲到的高速緩存塊:

直接映射緩存 在此緩存組織中,主內存中的每個位置只能進入緩存中的一個條目。因此,直接映射緩存也可以稱爲「單向組關聯」緩存。它沒有這樣的替換策略,因爲沒有選擇哪個緩存條目的內容被驅逐。這意味着如果兩個地點映射到相同的條目,他們可能會不斷敲門。儘管比較簡單,但直接映射緩存需要比關聯緩存大得多才能提供相當的性能,而且更難以預測。令x是緩存中的塊號,y是內存的塊數,n是緩存中塊的數量,然後在方程x = y mod n的幫助下完成映射。

0

假設你有一個256KB的緩存,並且它使用了一個超級簡單的算法,它緩存了line =(real address和0x3FFFFF)。

現在,如果你有啓動每個兆字節邊界上磚,然後在板1項20將揭開項目20板2的緩存實現,因爲它們使用相同的緩存行的標籤。

通過偏移平板,不同平板將不太可能共享相同的高速緩存行標記。如果Slab 1和Slab 2都包含32個字節的對象,而Slab 2則偏移8個字節,則其緩存標記永遠不會與Slab 1完全相同。

我敢肯定,我有一些細節錯,但把它爲它的價值。

+0

讓我看看我是否正確理解你;考慮slab0切片地址0x0,0x20,0x40等。slab1切片地址0x8,0x28,0x48等。使用您提供的簡單緩存行,沒有緩存行會浪費,因爲沒有兩個地址會給出相同的結果嗎? – user2162550

+0

閱讀了關於緩存策略和緩存組織後,我沒有看到你的答案如何匹配緩存基礎知識。根據許多可能的策略之一(例如LRU)選擇要交換的行,而不是根據地址的最低有效位的匹配來選擇,但是我找不到任何這樣做的策略。 – user2162550

+0

@ user2162550:查找「虛假共享」和緩存。 –