【计算机组成原理】 Cache存储器
一、Cache概述
1.1 什么是Cache
Cache(高速缓冲存储器)是位于CPU和主存之间的一种高速小容量存储器,用于解决CPU与主存之间速度不匹配的问题。
由于CPU速度远快于主存,如果CPU每次都要等待主存响应,会造成大量时间浪费。Cache通过存储最近使用过的数据和指令,使CPU能够以接近自身速度访问存储器。
1.2 程序访问的局部性原理
Cache的设计基于程序访问的局部性原理,包括:
- 时间局部性:最近被访问的数据很可能在不久的将来再次被访问。
- 空间局部性:与最近被访问数据相邻的数据很可能被访问。
例如:循环体内的变量会被反复访问(时间局部性),数组元素通常按顺序访问(空间局部性)。
二、Cache的基本结构
2.1 Cache的组成
Cache主要由以下部分组成:
- 存储体:存放从主存调入的数据块
- 地址映射机构:将主存地址转换为Cache地址
- 替换机构:Cache满时决定替换哪个块
- 写操作机构:处理写命中和写不命中的策略
2.2 基本概念
块(Block/Line):Cache和主存之间数据交换的基本单位。主存和Cache都被划分为大小相等的块。
标记(Tag):用于标识Cache中存放的是主存中哪个块的数据。
有效位(Valid Bit):表示该Cache行是否有效。
三、地址映射方式(重点)
地址映射是指主存块如何放置到Cache行中,主要有三种方式:
3.1 直接映射(Direct Mapped)
原理:每个主存块只能映射到Cache中唯一确定的位置。
映射公式:Cache行号 = 主存块号 mod Cache行数
地址结构:
标记(Tag) | Cache行号(Index) | 块内地址(Offset) |
优点:实现简单,访问速度快,无需替换算法。
缺点:不够灵活,容易发生冲突(不同块映射到同一行)。
3.2 全相联映射(Fully Associative)
原理:每个主存块可以映射到Cache中任意位置。
地址结构:
标记(Tag) | 块内地址(Offset) |
优点:最灵活,冲突最少,Cache利用率高。
缺点:硬件复杂,需要比较所有行的标记,成本高。
3.3 组相联映射(Set Associative)
原理:Cache分成若干组,每组包含若干行。主存块先映射到组(直接映射),再在组内任意放置(全相联)。
映射公式:组号 = 主存块号 mod 组数
地址结构:
标记(Tag) | 组号(Index) | 块内地址(Offset) |
K路组相联:每组有K个Cache行,称为K路组相联。如2路、4路、8路组相联。
优点:兼顾灵活性和实现复杂度,是实际应用最广泛的方式。
3.4 三种映射方式对比
特性 | 直接映射 | 全相联映射 | 组相联映射 |
灵活性 | 低 | 高 | 中 |
冲突率 | 高 | 低 | 中 |
硬件复杂度 | 低 | 高 | 中 |
访问速度 | 快 | 慢 | 较快 |
四、替换算法(重点)
当Cache已满且需要调入新块时,需要选择一个块替换出去。
4.1 随机算法(Random)
随机选择一个块进行替换。实现最简单,但可能替换掉即将使用的块。
4.2 FIFO(先进先出)
替换最早进入Cache的块。实现简单,但没有考虑访问频率,可能替换常用块。
4.3 LRU(最近最少使用)★
替换最久未被访问的块。符合局部性原理,命中率较高,是实际应用最广泛的算法。
实现方式:为每行设置计数器,命中时清零,未命中时计数器+1,替换计数器最大的行。
4.4 LFU(最不经常使用)
替换访问次数最少的块。需要记录访问次数,实现较复杂。
五、写策略(重点)
写策略解决Cache与主存数据一致性问题,分为写命中和写不命中两种情况。
5.1 写命中(Write Hit)
写直达(Write Through):同时写Cache和主存。优点是数据一致性好,缺点是写速度慢。
写回(Write Back):只写Cache,替换时才写回主存。需要设置修改位(Dirty Bit)。优点是写速度快,缺点是数据一致性差。
5.2 写不命中(Write Miss)
写分配(Write Allocate):先将主存块调入Cache,再写入。通常与写回策略配合使用。
非写分配(No Write Allocate):直接写入主存,不调入Cache。通常与写直达策略配合使用。
5.3 常见组合
写直达 +非写分配 | 写回 +写分配 |
数据一致性好,实现简单,适合单处理器 | 写效率高,适合多处理器 |
六、Cache性能分析(重点)
6.1 命中率与缺失率
命中率(Hit Rate):CPU访问Cache命中的次数占总访问次数的比例。
缺失率(Miss Rate):= 1 - 命中率
6.2 平均访问时间
公式:
平均访问时间=命中时间+缺失率×缺失代价
其中:
- 命中时间:访问Cache所需时间(通常1-3个时钟周期)
- 缺失代价:从主存调入块所需时间(通常50-100个时钟周期)
6.3 加速比
加速比=无Cache时的访问时间/有Cache时的平均访问时间
6.4 影响Cache性能的因素
- Cache容量:容量越大,命中率越高,但成本也越高,访问速度可能降低。
- 块大小:块太小不能充分利用空间局部性;块太大则块数减少,且调入时间长。
- 相联度:相联度越高,冲突越少,但硬件越复杂,访问时间越长。
- 替换算法:好的替换算法能提高命中率。
