高速缓冲存储器cache
关注wx"印象编程"领取更多免费笔记~
cache的工作原理
为了进一步提升CPU访问主存的性能,通常会在CPU与主存一直增加一个隐藏的小容量的快速的SRAM,称为cache。

SRAM相对DRAM速度更快,但是容量有限,成本更高,功耗较大。
将主存的经常访问或即将访问的数据的副本调度到小容量的SRAM中(即cache中),因为CPU执行的程序具有较强的程序局部性,使得大部分的数据的访问可以快速的SRAM中进行。从而提升系统性能。
| 概念 | 说明 |
|---|---|
| 程序局部性 | 分为时间局部性和空间局部性。指在执行时呈现局部性规律, 整个程序的执行仅限于程序中某一部分,而执行程序所需要指令和数据也仅局限于某个存储区域内。 |
| 时间局部性 | 指当程序访问一个存储位置时,该位置在未来可能会被多次访问, 程序的循环结构和调用过程体现时间局部性。 |
| 空间局部性 | 指一旦程序访问了某个存储单元,某附近的存储单元也将被访问。 计算机指令代码、数据、结构体元素通常都是在主存中顺序存放的,对应的数据访问体现空间局部性。 |

其实对于计算机系统来说,任何存在速度差异的地方都有配置有高速缓存存储器(cache),缓解快速CPU与慢速的主存之间的速度差异。

cache实现的关键技术:
①数据查找:如何快速判断数据是否在cache中,命中访问时间包括数据查找时间和cache访问时间,所以查找速度很重要。
②地址映射:主存中的数据应如何放置在cache中,是任意放置还是按一定规则放置,对应不同的地址映射策略。
③替换策略:cache满后如何处理,选择怎样的cache数据块进行替换或者淘汰,对应不同的替换策略。
④写入策略:如何保证cache和主存的一致性,对应不同的写入策略,分为写回和写穿策略。
cache的基本概念
增加cache后,CPU不再直接访问慢速的主存,而是通过字节地址快速访问cache,访问时首先通过一定的查找机制判断数据是否在cache中。
1. 命中
如果数据在cache中,则称为数据命中(Hit),将命中时数据访问时间为,该时间包括查找时间和cache访问时间两盒部分。

注意:CPU与cache之间每次交换的是一个字,而主存与cache之间交换的是一个数据块。
2. 缺失
如果数据不在cache中,则称为数据缺失(Miss),此时需要将缺失数据从主存调入cache中才能访问数据;数据确实时的访问时间称为缺失补偿(Miss Penalty),包括数据查找时间、主存访问时间、cache访问时间。访问主存的过程较为漫长,通常用主存访问时间表示。

cache和主存都会被分为若干个大小的数据块(Block),每个数据库又包含若干个字,数据缺失时需要将数据所在的块从慢速主存调入cache中,这样相邻的数据也会随着数据块载入cache。这种预读策略可充分利用空间局部性,提高顺序访问的命中概率,但块的大小对cache有较大影响,块过小则无法无法利用预读策略优化空间局部性,块太大则将使得替换算法无法充分利用时间局部性。

进行数据分块后,主存地址和cache地址均可以分为块地址和块内偏移地址(Offset)两部分,块内偏移地址也称块内偏移,由于cache容量较小,因此主存块地址字段长度大于cache块地址长度字段。
系统性能评估
为评估cache系统的性能,引入命中率h,设为某程序运行期间命中cache的次数,为从主存中访问信息的次数。

1-h称为缺失率,命中率h越接近于1表示系统性能越好,表示命中访问时间,表示缺失访问时间,则cache/主存系统的平均访问时间为:

设计高速缓冲存储器的目的是以较小的硬件开销使平均访问时间接近。
访问效率公式e如下:

存储系统的访问效率与r和h有关,命中率h的值越接近1,访问效率越高;另外r的值不能太大,一般以5~10合适。
命中率与程序局部性、cache容量、数据块大小、组织方式有关。
读写流程
cache读流程
cache读操作基本流程:当CPU需要访问主存时,首先以主存地址RA中的主存地址为关键字在查找表中进行数据查找,如果能查找到对应数据,表示数据命中,否则表示数据缺失。

①如果数据命中则根据查找表提供的信息访问对应的cache数据块,再将读出的数据信息送入CPU,数据命中访问时间最短。
②如果数据缺失,则需要访问慢速的主存,为利用空间局部性,需要将RA地址所在的数据块副本载入cache。载入时可能存在cache已满或载入位置有数据冲突的情况,此时需要利用替换算法腾空位置,载入后还需要更新查找表,方便后续查找。
cache写操作
cache写操作基本流程:当CPU需要写数据时,首先把主存地址WA中的主存地址为关键字在查找表中进行数据查找,如果能查找到对应数据,表示数据命中,否则表示数据缺失。

数据命中时,同样可以由查找表提供的地址信息来将数据写入cache中。
如果新写入cache中的数据与主存中的原始数据不一致,则称这部分为脏数据(Dirty Data)。
数据写入后,还需根据不同的写入策略决定下一步操作。
写入策略

- 写回策略
写操作仅更新
cache,当CPU修改cache中的数据时,不立刻同步到主存,将该cache行标记为脏数据,表示数据已修改但是尚未写回主存。
写命中:CPU修改cache中的数据,同时将相同的数据写入主存。
写未命中:直接更新主存,是否将数据加载到cache取决于具体实现。 - 写穿策略
写操作同时更行cache和主存,当CPU修改cache中的数据时,立即同步更新主存,确保cache和主存的数据始终一致。
写命中:CPU修改cache中数据,将对应的cache行的脏位(Dirty Bit)设置为1,主存暂不更新,保持旧值。
写未命中:cache未满,直接加载主存块到cache再执行写操作并标记脏位;cache已满且待替换的行是脏的,则先将脏数据写回主存,再加载新数据到cache并执行写操作。
两种策略的原理:

两种策略的对比:
| 特性 | 写回策略 | 写穿策略 |
|---|---|---|
| 主存更新时机 | 延迟写回(替换脏块时写回) | 立即同步更新 |
| 脏位维护 | 必需 | 不需要 |
| 写操作性能 | 高(仅修改cache) | 低(需要访问主存) |
| 总线带宽压力 | 低(减少写次数) | 高(每次写都访存) |
| 数据一致性 | 弱(主存数据可能过时) | 强(主存始终更新) |
| 硬件复杂度 | 高(需维护脏位和替换逻辑) | 低(无需额外维护) |
cache地址映射
cache地址映射机制

地址映射指将主存地址空间映射到cache的地址空间,即把存放在主存中的程序或数据块载入cahche块的规则,地址映射主要有三种方法。
1. 全相联映射(Full Associative Mapping):各主存块都可以映射在**cache中的任意块**。
2. 直接相联(Direct Mapping):各主存块都只能映射到cache的固定块。
3. 组相联(Set Associative Mapping):各主存块只能映射到cache的固定组的任意块。
cache结构

cache被分为若干行,每行的大小与主存块相同;cache每行包含四部分,是cache要保存的信息。
相联存储器
为了实现快速的查找,需要用到相联存储器。
![]()
相联存储器(CAM)是一种按照内容进行访问的存储器,用于存放查找表,其内容存储的基本数据单元是键值对(key,Value)。
CAM的输入不是地址,而是检索关键字Key,输出是该关键字对应的value值。

全相联映射
1. 全相联映射基本原理
全相联映射下,主存中每一个数据块都可以放置到**cache任意一个数据块中,是一对多**的映射关系。
新的主存数据块可以载入cache的任意一个空位置,只有cache满时才需要进行数据块置换。
全相联映射时cache利用率最高,需要CAM提供快速的查找功能。
2. 地址结构
由于主存块可以放置在cache的任意块中,为了方便后续查找,主存数据块载入时还需要记录若干的标记标志信息。
主要包括有效位、主存块地址标志、脏数据标志位、淘汰计数等信息。
通常把一个cache数据块和相关的标记标志信息一起称为一个cache行/槽(Line/Slot),因此cache有多少个数据块就有多少个cache行。
- 3. 全相联映射方式特点
①主存数据块可以映射到cache的任意一行,因此cache利用率高;
②只要cache中还有空行就不会引起冲突,因此cache的冲突率低;
③查找时需要并发比较查找表中所有项,每个cache行对应一个比较电路,硬件较高,只适合小容量cache使用
④cache满时载入新数据块需要根据替换算法进行替换,替换策略和算法较为复杂。
直接映射
1. 直接映射原理
直接映射中每一个主存地址只能映射到cache中固定的行;
映射的规则为行主存块号行数
将主存按照cache大小进行分区,每个分区中包含的块数与cache的行数相同。
直接相联映射逻辑示意图如下

2. 地址结构
3. 直接相联映射方式的特点
①主存数据块只能映射到cache的特定行,因此cache利用率,命中率低;
②index相同的所有主存映射到cache中的同一行,cache未满也可能发生数据冲突,冲突率高;
③查找时只需要根据index字段访问对应cache行的标记字段tag并进行比较,只需要一个比较器,硬件成本较低,适合于大容量cache使用;
④无需使用复杂的替换算法,直接替换冲突数据块即可。
组相联映射
1. 组相联映射原理
全相联映射命中率高,但查找硬件条件成本高;而直接相联映射查找成本低,但是命中率低。
组相联映射就是直接映射和全相联映射两种方法的折中,既能提高命中率,又能降低查找硬件的开销。
组相联映射将cache分为固定大小的组,每组有k组,称为k-路组相联;主存数据块首先采用直接相联映射的方式定位到cache中固定的组,然后采用全相联的方式映射的方式映射到组内任何一个cache行:
组号主存块号组数
2. 地址结构

组相联映射逻辑示意图如下三种映射方式比较

3种不同映射方式的主存地址划分,s>r>d,当组索引字段的位宽d=0时,也就是整个cache只分为一组时,组相联映射变成了全相联映射,而当d为最大值r时,每组只有一个cache行,组相联映射变成了直接相联映射。
| 查找复杂度 | 淘汰算法复杂度 | 命中率 | |
|---|---|---|---|
| 直接映射 | 容易 | 简单 | 较低 |
| 全相联映射 | 复杂 | 复杂 | 最佳 |
| 组相联映射 | 适中 | 折中 | 较好 |
967

被折叠的 条评论
为什么被折叠?



