分层存储体系结构

为什么需要分层存储?因为我们想要存储又大又快,但是只用一层存储无法达到目的,所以我们采用多层存储让那些越大越慢的数据距离处理器远一些,并确保处理器需要的大多数数据存储在更快的层中。

分层存储的基本原则

局部性原理

最近使用的代码或者数据很有可能在不久的将来继续用到。

局部性原理分为:时间局部性、空间局部性。

一个程序可能在其生命周期中引用不同的内存位置,但不是在同一时间。

避免重复运算

如果计算某个东西计算代价很高,那么可以记住一会儿答案,以防不久之后又需要它。

需要局部性的支持。如果缺乏局部性,会存储大量不同的数据,同时很可能查询大量数据的开销会大于重新计算的开销。

成本均摊

如果成本可以平摊到多个单元上,那么理论上可以承受较大的成本开销。

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})表示下一层感知到的访问时间。

因此

[T_i = h_i*t_i+(1-h_i)*(t_i+T_{i+1})=t_i+(1-h_i)*T_{i+1} ]

因此我们希望((1-h_i)*T_{i+1})尽可能的低,所以我们可以降低缺失率,或者减少下一层的感知访问时间。

对于降低缺失率,我们可以增加cache的容量,但是这会使得(t_i)增加;还可以通过更好的管理降低缺失率,比如更好的替换策略以及更好的预取策略。

对于减少下一层的感知访问时间,可以从材料上使下一层访问更快,但是这会使成本增加;或者引入中间层做出折中。

这里看一个Intel Pentium 4的例子:

可以看到减少缺失率带来的收益是非常显著的。

关于Cache的详细内容,且听下回分解hhh

原文地址:https://www.cnblogs.com/LuoboLiam/p/13427254.html