• 缓存机制


    1. 局部性原理

      局部性原理是指计算机在执行某个程序时,倾向于使用最近使用的数据。局部性原理有两种表现形式:时间局部性和空间局部性。

      时间局部性是指被引用过的存储器位置很可能会被再次引用,例如:重复的引用一个变量时则表现出较好的时间局部性

      空间局部性是指被引用过的存储器位置附近的数据很可能将被引用;例如:遍历二维数组时按行序访问数据元素具有较好的空间局部性

    2. 缓存与缓冲

      缓冲通常在接收者和发送者速度差异较大的场合使用,例如:网络缓冲区;

      缓存通常用于补偿不同存储器之间的读写速度差异,例如:Cache;

      缓存和缓冲一个重要的区别是:对于缓冲来说,接收者接下来想要使用的数据就在缓冲区中;而缓存的有效性是依赖于局部性的,即对于缓存来说,快速存储器接下来想要使用的数据不一定就在缓冲存储器中。

    3. 缓存层次结构

      

      如图所示,最上层的是寄存器,最下层的是远程文件系统,从下到上,存储器的速度更快,造价更贵因而容量更小。

      上一层的存储器保存着下一层存储器中部分数据的拷贝,上一层即作为下一层的缓存;

      当需要第k+1层的某个数据时,先在第k层中寻找,若找到,则称为缓存命中,若没找到,则称为缓存不命中;

      当缓存不命中时,需要从第k+1层拷贝需要的数据到第k层,这样就可能会需要替换第k层中已经缓存的某些数据,需要替换时通常会有个替换策略来指导替换哪些数据;

      缓存不命中的种类:

      冷不命中,即第k层尚且没有缓存第k+1层的数据;

      冲突不命中,即第k+1层中可能有多个数据被缓存到第k层的同一个位置,如果连续访问这些会被缓存于第k层同一个位置的数据,则可能出现第k层明明缓存空间未满,但仍然不命中。如果缓存反复加载和替换相同位置处的数据,则会出现“抖动”的现象。

    4. 通用的高速缓存存储器结构

     

      如图所示,高速缓存被组织成多个缓存组,每个缓存组里有若干个缓存行,每个缓存行包括有效位(1位即可)、标记位和数据块。有效位用来表示该缓存行是否有效,标记位用来唯一标识一个缓存行,数据块即保存缓存的数据。访问高速缓存的地址格式如图所示,共m位,中间s位表示组索引,则共有2s个缓存组,低b位表示要访问的数据在缓存行数据块中的偏移量,剩下的高t位则用来表示缓存行的标记位。上图中表示的高速缓存的大小等于 2s * E * 2b 字节。

      使用地址的中间s位作为组索引也是有原因的,倘若使用地址的高位作为组索引,则存储器中连续的若干块就会被缓存到同一个高速缓存块中,增加了冲突不命中的可能性。

      访问高速缓存的过程:先根据组索引找到缓存行所在的组,然后根据标记位在该组中查找所需的缓存行,找到缓存行后再根据块偏移量访问需要的数据。

      当只有1个缓存组时,即称为全相联高速缓存,全相联高速缓存的一个组中包含了所有的缓存行,这样访问全相联高速缓存的地址就不再需要组索引。因为全相联高速缓存的一个组中包含所有的缓存行,这样根据标记位查找缓存行就会比较费时,因此全相联高速缓存只适合包含较少的缓存行,例如:虚拟存储器系统中的TLB(地址翻译缓冲存储器)。

     

    5. 关于缓存的写

      假设我们需要对缓存中的数据进行修改,那么在对缓存中的数据进行写操作之后,如何更新缓存层次结构中下一层中的数据呢?有两种策略:

      直写:即更新完缓存后立即更新下一层中的数据;

      写回:更新缓存后不立即更新下一层中的数据,而是等到缓存中该数据被替换时再更新下一层中的数据;使用写回法的话,缓存行中需要额外维护一个修改位来标记该缓存行是否被修改。

     

     

    参考资料 《深入理解计算机系统》

  • 相关阅读:
    ThetaSome_ThetaAll子查询
    BMP文件解析
    IN-子查询
    由顶点坐标计算任意多边形面积
    Java入门——多态
    使用Notepad++开发Java程序
    C#利用VUDP.cs开发网络通讯应用例程
    C#利用Vini.cs操作INI文件
    RC522射频卡读写模块驱动(仅读取)
    Tupper自我指涉公式生成器
  • 原文地址:https://www.cnblogs.com/jqctop1/p/4714116.html
Copyright © 2020-2023  润新知