2017-10-13 55 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:查找“虚假共享”和缓存。 –