码迷,mamicode.com
首页 > 其他好文 > 详细

缓存机制

时间:2015-08-09 00:22:00      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

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 字节。

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

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

 

5. 关于缓存的写

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

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

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

缓存机制

标签:

原文地址:http://www.cnblogs.com/jqctop1/p/4714116.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!