为什么需要分层存储?因为我们想要存储又大又快,但是只用一层存储无法达到目的,所以我们采用多层存储让那些越大越慢的数据距离处理器远一些,并确保处理器需要的大多数数据存储在更快的层中。
分层存储的基本原则
局部性原理
最近使用的代码或者数据很有可能在不久的将来继续用到。
局部性原理分为:时间局部性、空间局部性。
一个程序可能在其生命周期中引用不同的内存位置,但不是在同一时间。
避免重复运算
如果计算某个东西计算代价很高,那么可以记住一会儿答案,以防不久之后又需要它。
需要局部性的支持。如果缺乏局部性,会存储大量不同的数据,同时很可能查询大量数据的开销会大于重新计算的开销。
成本均摊
如果成本可以平摊到多个单元上,那么理论上可以承受较大的成本开销。
Cache理论基础
原理
时间局部性:这个数据马上就会被再次访问,所以把这个数据放到一个可以快速访问的内存中。
空间局部性:这个数据周围的数据马上也会被访问,所以把这个数据附近的所有数据(block)放到可以快速访问的内存中。
流水线中的Cache
我们希望cache的存取尽可能快,而在高频的流水线中,每个流水段的时间其实也是很快的,那么为了使cache尽可能大并且可以满足流水线的高频访问,所以对cache进行分层处理。目前的处理器都存在着多级的cache(L1,L2 cache等)。
那么谁来管理分层数据迁移?早期的是由程序员来管理的,而现在绝大多数情况是硬件来做的,所以对程序员来说是透明的,但是如果我们能在写代码的时候利用一些硬件的性质,就可以让我们的程序跑得更快。
其中管理cache的硬件就是我们说的内存管理单元(MMU)。
分层的延迟分析
假设一个给定的存储层次\(i\),它技术上固有的访问时间是\(t_i\),我们感受到的访问时间是\(T_i,(T_i>t_i)\)。
除了最外层,最外层中包含着数据的源地址,而其他层中都是这些数据的某些拷贝。当访问一个固定地址时,可能命中也可能缺失,那么:
如果命中(命中率是\(h\%\)),访问时间是\(t_i\),
如果缺失,访问时间是\(t_i+T_{i+1}\),\(T_{i+1}\)表示下一层感知到的访问时间。
因此
因此我们希望\((1-h_i)*T_{i+1}\)尽可能的低,所以我们可以降低缺失率,或者减少下一层的感知访问时间。
对于降低缺失率,我们可以增加cache的容量,但是这会使得\(t_i\)增加;还可以通过更好的管理降低缺失率,比如更好的替换策略以及更好的预取策略。
对于减少下一层的感知访问时间,可以从材料上使下一层访问更快,但是这会使成本增加;或者引入中间层做出折中。
这里看一个Intel Pentium 4的例子:
可以看到减少缺失率带来的收益是非常显著的。
关于Cache的详细内容,且听下回分解hhh