为什么两条地址相差恰好为65,536字节的行不能同时存储在高速缓存中?

时间:2019-08-06 11:29:43

标签: caching memory

2012年,我读了一本书《 Andrew Tanenbaum-结构化计算机组织》(第6版),我听不懂。

“此映射方案将连续的内存行放入连续的缓存条目中。实际上,缓存中最多可以存储64 KB的连续数据。但是,两行的地址恰好相差65,536字节或任何整数倍该数目的数字不能同时存储在高速缓存中(因为它们具有相同的Line值)。例如,如果程序访问X位置的数据,然后执行一条需要X + 65,536位置(或其他任何位置)的数据的指令在同一行中),第二条指令将强制重新加载缓存条目,并覆盖其中的内容。如果这种情况发生的次数足够多,可能会导致行为不佳。事实上,最坏情况下的缓存行为要比根本没有缓存,因为每个内存操作都涉及读取整个缓存行而不是一个字。”

为什么它们的Line值相同?

1 个答案:

答案 0 :(得分:0)

这是由于缓存设计中的两个概念。首先,在缓存设计中称为 associativity 的概念。对于每个可能的输入高速缓存行地址(在现代x86-64系统上64字节对齐),高速缓存中只能访问N个可能的插槽。

第二个问题很像哈希映射中使用的哈希函数遇到的问题。简而言之,必须使用某种方案将输入地址转换为高速缓存中的插槽。请注意,这本书说缓存可以容纳64(可能是英制)千字节。 64 kB是65,536字节,所讨论的神奇的缓存破坏距离也是65,536!因此,在这种情况下,地址->缓存槽函数是一个简单的and操作,看来作者正在谈论一种1路关联缓存(也就是说,每行只能存储在内部的一个位置缓存。)导致上述冲突。

为什么微处理器设计人员会选择简单的AND功能?嗯...主要是因为它很简单。除了将晶体管浪费在更复杂的逻辑上之外,诸如AND之类的基本操作就足够了。