zoukankan      html  css  js  c++  java
  • 分层存储体系结构

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

    分层存储的基本原则

    局部性原理

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

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

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

    避免重复运算

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

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

    成本均摊

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

    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

  • 相关阅读:
    Java编程练习(四)——集合框架应用
    89. Gray Code (Java)
    加解密算法
    Cookie、Session和Token
    87. Scramble String (Java)
    51. N-Queens (JAVA)
    85. Maximal Rectangle (JAVA)
    84. Largest Rectangle in Histogram (JAVA)
    81. Search in Rotated Sorted Array II (JAVA)
    77. Combinations (JAVA)
  • 原文地址:https://www.cnblogs.com/LuoboLiam/p/13427254.html
Copyright © 2011-2022 走看看