从指南了解linux内核第3版,第8.2.10章,Slab着色 -
我们从第2章了解到,相同的硬件缓存行映射了许多不同的RAM块 . 在本章中,我们还看到相同大小的对象最终存储在缓存中的相同偏移处 . 在不同平板内具有相同偏移的对象将以相对高的概率最终映射到同一缓存行中 . 因此,高速缓存硬件可能浪费存储器周期将来自同一高速缓存线的两个对象来回传送到不同的RAM位置,而其他高速缓存线未充分利用 . slab分配器尝试通过称为slab着色的策略来减少这种令人不快的缓存行为:将不同的任意值(称为颜色)分配给slab .
(1) 我无法理解板坯着色试图解决的问题 . 当普通过程访问数据时,如果它不在高速缓存中并且遇到高速缓存未命中,则将数据与来自过程试图访问的数据的周围地址的数据一起提取到高速缓存中以提高性能 . 如何发生这种情况,以便相同的特定缓存行不断交换?进程持续访问两个不同存储区域的存储区域内的相同偏移中的两个不同数据地址的概率非常低 . 即使它确实发生了,缓存策略通常会根据某些议程选择要交换的行,例如LRU,Random等 . 没有策略存在这样选择根据被访问地址的最低有效位匹配来驱逐行 . .
(2) 我无法理解平板着色如何从平板末端到开头的自由字节,以及第一个对象具有不同偏移量的不同平板的结果,解决了缓存交换问题?
经过一次小规模调查后,我相信我找到了问题的答案 . 答案已发布 .
2 回答
我想我明白了,答案与 Associativity 有关 .
缓存可以划分为某些集合,每个集合只能缓存某些内存块类型 . 例如,set0将包含地址为8的倍数的内存块,set1将包含地址为12的地址的内存块 . 原因是为了提高缓存性能,以避免在整个缓存中搜索每个地址的情况 . 这样,只需要搜索某一组缓存 .
现在,从链接Understanding CPU Caching and performance
让我们取内存块地址
0x10000008
(来自带有颜色C的slabX)和内存块地址0x20000009
(来自带有颜色Z的slabY) . 对于大多数N
(缓存中的集合数),<address> MOD <N>
的计算将产生不同的值,因此缓存数据的设置不同 . 如果地址具有相同的最低有效位值(例如0x10000008
和0x20000008
),则对于大多数N
,计算将产生相同的值,因此块将冲突到相同的高速缓存集 .因此,通过为不同平板中的对象保持不同的偏移(颜色),平板对象可能会在缓存中到达不同的集合,并且不会与同一集合冲突,并且整体缓存性能会提高 .
EDIT: 此外,如果缓存是直接映射的缓存,那么根据维基百科,CPU Cache,不存在缓存替换策略,并且modulu计算产生将存储内存块的缓存块:
假设你有一个256 KB的缓存,它使用一个超级简单的算法,它会缓存line =(实地址AND 0x3FFFFF) .
现在,如果你有每个兆字节边界的平板,那么平板1中的第20项将使平板2的第20项从缓存中踢出,因为它们使用相同的缓存行标记 .
通过偏移平板,不同平板将不太可能共享相同的高速缓存行标签 . 如果Slab 1和Slab 2都保存32字节对象而Slab 2偏移8字节,则其缓存标记永远不会完全等于Slab 1 .
我确定我有一些错误的细节,但要把它当作它的 Value .