第6章 存储系统设计 - 核心例题详解
本文档整理了第6章存储系统设计中的核心例题,包括课件中的必考题目以及其他可能出现的典型题型。
📚 基础知识与参数说明
在开始解题之前,需要先理解以下基本概念、参数符号和核心公式。
一、常用参数符号
1. 性能参数
:命中率 (Hit Rate), :命中次数 :失效(未命中)次数 :总访存次数, :Cache访问时间(周期) :主存访问时间(周期) :平均访问时间(等效访问时间) :访问效率, :速度比,
2. 地址映像参数
- 主存块号:主存地址所在的数据块编号
- Cache行号/组号:Cache中的位置编号
- 块大小/页大小:数据块或页的字节数
- Tag(标记):用于地址比较的标记字段
- Index(索引):Cache行号或组号
- Offset(偏移):块内或页内偏移地址
3. 虚拟存储参数
- 虚页号:虚拟地址中的页号
- 实页号/物理页号:物理地址中的页号
- 页表项:页表中的每个条目
- TLB命中率:快表的命中率
二、核心公式汇总
1. 命中率与失效率
2. 平均访问时间
3. 访问效率
其中
4. 预取技术
- 预取后失效率:
- 预取后命中率:
- 其中
5. 地址映像
- 主存块号:
- 直接映像:
- 组相联:
- Cache组数:
6. 页表计算
- 总虚页数:
- 每页表项数:
- 页表级数:
三、解题思路与方法
1. 性能计算类题目
解题步骤:
- 明确已知条件(命中次数、失效次数、访问时间等)
- 计算命中率
- 根据公式计算
或 - 注意单位换算(ns、μs、ms等)
常见题型:
- 给定命中/失效次数,求命中率
- 给定命中率和访问时间,求平均访问时间和效率
- 给定效率要求,反求命中率
- 预取技术对命中率的影响
2. 地址映像类题目
解题步骤:
- 确定主存地址和块大小,计算主存块号
- 确定Cache结构(总块数、路数、组数)
- 根据映像方式计算Cache位置
- 分析地址结构(Tag、Index、Offset的位数)
常见题型:
- 给定主存地址,求映射到的Cache位置
- 分析地址结构(各字段位数)
- 计算Tag字段大小
3. 替换算法类题目
解题步骤:
- 画出Cache状态表(建议手动画表)
- 逐个处理访问序列
- 判断命中/失效
- 失效时根据算法规则选择替换块
- 统计命中次数,计算命中率
关键区别:
- FIFO:替换最早进入的,命中时不改变顺序
- LRU:替换最久未使用的,命中时更新为最新
- OPT:替换未来最久不用的(需预知未来)
4. 虚拟存储类题目
解题步骤:
- 计算虚页数和实页数
- 分析页表结构(单级或多级)
- 计算页表项大小
- 计算TLB命中率对性能的影响
常见题型:
- 页表级数计算
- 页表项大小计算
- TLB命中率分析
- 综合访存流程(TLB + 页表 + Cache + 主存)
四、常见题型分类
- 基础计算题:直接套用公式,如命中率、平均访问时间
- 综合分析题:需要多个步骤,如预取技术、多级存储
- 地址变换题:需要理解地址结构,如映像方式、页表
- 算法模拟题:需要手动填表,如替换算法
- 综合应用题:涉及多个层次,如TLB+Cache+主存
五、解题注意事项
- 单位换算:注意ns、μs、ms、KB、MB、GB之间的换算(1024倍关系)
- 取整问题:主存块号需要向下取整,页表级数需要向上取整
- 公式选择:根据已知条件选择合适的公式
- 状态更新:替换算法中注意FIFO和LRU的状态更新规则不同
- 层次关系:理解Cache、主存、辅存之间的层次关系
- 命中/失效:明确区分命中次数和失效次数,不要混淆
一、性能参数计算(命中率、时间、效率)
【例 6-1】基础命中率计算
题目描述:
假设某计算机的存储系统由Cache和主存组成。某程序执行过程中访存1000次,其中访问Cache失效(未命中)50次,则Cache的命中率是多少?
解题过程:
分析数据:
- 访存总次数
次。 - 失效(Miss)次数
次。 - 因此,命中(Hit)次数
次。
- 访存总次数
计算公式:
结果:Cache的命中率为 95%。
关键公式:
- 命中率:
【例 6-2】综合性能计算(必考题)
题目描述:
CPU执行一段程序时,Cache完成存取的次数为5000次,主存完成存取的次数为200次。已知Cache存储周期
- Cache的命中率
; - 等效访问时间
; - Cache-主存系统的访问效率
。
解题过程:
求命中率
: - Cache完成次数即命中次数:
。 - 主存完成次数即失效次数:
。 - 总访存次数:
。
- Cache完成次数即命中次数:
求等效访问时间
: - 公式:
- 代入数据:
- 公式:
求访问效率
: - 公式:
- 代入数据:
- 公式:
关键公式:
- 等效访问时间:
- 访问效率:
,其中 为速度比
【例 6-3】速度比与效率的关系
题目描述:
假设
解题过程:
使用效率公式推导形式(设速度比
当
时: (课件结果取为 0.72)
当
时:
结论:命中率越高,系统效率越高。当速度比
【例 6-4】虚拟存储器的极端情况
题目描述:
在虚拟存储系统中,两级存储器的速度相差特别悬殊
解题过程:
列出公式:
代入已知数值:
求解
:
结论:在虚存系统中,命中率必须极高(接近100%),否则效率会急剧下降。这说明了虚拟存储系统对命中率的极高要求。
二、预取技术与性能提升
【例 6-5】预取对命中率的影响
题目描述:
在一个Cache存储系统中,当Cache的块大小为一个字时,命中率
- 计算块大小为 4个字 时,Cache存储系统的命中率是多少?
- 假设
,分别计算块大小为1字和4字时的访问效率。
解题过程:
计算新命中率
: - 预取技术会让不命中率降低
倍。这里 。 - 根据课件公式(基于失效率降低):
(或者使用课件上的另一公式 )
- 预取技术会让不命中率降低
计算效率
: - 块大小=1字时 (
): - 块大小=4字时 (
):
- 块大小=1字时 (
关键公式:
- 预取后失效率:
,其中 - 预取后命中率:
【例 6-6】反求重复利用率
题目描述:
在一个虚拟存储系统中,
解题过程:
先求目标命中率: 根据【例6-4】的结论,在
且 时,需要的命中率 。 利用预取公式求重复率
: - 设数据块大小为
(4K),重复率为 。 - 总倍数
。 - 利用失效率降低公式:
- (注:课件中直接代入计算得出的结果是 44,可能是中间精度取舍略有差异,考试时按课件逻辑即可:重复利用率需达到几十次级别)。
- 设数据块大小为
结论:要达到高访问效率,数据在主存中的重复利用率必须很高(通常需要几十次以上)。
三、地址映像(找位置)
【例 6-7】组相联映射计算
题目描述:
某计算机的Cache共有 16块,采用 2路组相联 映像方式(即每组2块)。每个主存块大小为 32字节,按字节编址。
问:主存129号单元 所在的主存块应装入到的 Cache组号 是多少?
解题过程:
求主存块号:
(即第4块,因为 0~31是第0块,32~63是第1块... 128~159是第4块)
求Cache的组数:
计算映射组号:
结果:该主存块只能装入Cache的 第4组。
关键公式:
- 主存块号 =
- Cache组数 =
- Cache组号 = 主存块号
【例 6-7扩展】直接映像地址计算
题目描述:
某Cache采用直接映像方式,Cache容量为8KB,块大小为32字节。主存容量为256KB,按字节编址。
- 主存地址需要多少位?
- Cache地址需要多少位?
- 主存地址129应映射到Cache的哪一行?
解题过程:
主存地址位数:
- 主存容量 = 256KB =
字节 - 主存地址位数 = 18位
- 主存容量 = 256KB =
Cache地址位数:
- Cache容量 = 8KB =
字节 - Cache地址位数 = 13位
- Cache容量 = 8KB =
地址结构分析:
- 块大小 = 32字节 =
字节,块内偏移 = 5位 - Cache行数 =
,行号 = 8位 - 主存块数 =
- 区数 =
,区号 = 5位
- 块大小 = 32字节 =
主存地址129的映射:
- 主存块号 =
- Cache行号 =
- 结果:映射到Cache的第4行
- 主存块号 =
地址结构:
- 主存地址:
区号(5位) | 行号(8位) | 块内偏移(5位) - Cache地址:
行号(8位) | 块内偏移(5位)
【例 6-7扩展2】全相联映射地址结构
题目描述:
某Cache采用全相联映像方式,Cache容量为4KB,块大小为64字节。主存容量为1MB。
- 主存地址需要多少位?
- 地址结构中Tag字段需要多少位?
解题过程:
主存地址位数:
- 主存容量 = 1MB =
字节 - 主存地址位数 = 20位
- 主存容量 = 1MB =
地址结构分析:
- 块大小 = 64字节 =
字节,块内偏移 = 6位 - 主存块数 =
- Tag字段 = 20 - 6 = 14位
- 块大小 = 64字节 =
地址结构:
- 主存地址:
Tag(14位) | 块内偏移(6位) - Cache中需要存储完整的Tag用于比较
四、替换算法(模拟填表)
【例 6-8】替换算法模拟
题目描述:
一个程序共有5个块组成,程序执行过程中的块地址流如下:
1, 2, 1, 5, 4, 1, 3, 4, 2, 4
假设分配给这个程序的Cache存储器共有 3个块。分析 FIFO 和 LRU 的使用情况(是否命中、是否替换)。
解题过程(建议手动画表):
1. FIFO (先进先出) 过程:
| 访问块 | Cache状态 | 命中/替换 | 说明 |
|---|---|---|---|
| 1 | [1, , ] | 调入 | 未满 |
| 2 | [1, 2, ] | 调入 | 未满 |
| 1 | [1, 2, ] | 命中 | FIFO状态不变 |
| 5 | [1, 2, 5] | 调入 | 满 |
| 4 | [4, 2, 5] | 替换1 | 最早进的是1 |
| 1 | [4, 1, 5] | 替换2 | 最早进的是2 |
| 3 | [4, 1, 3] | 替换5 | 最早进的是5 |
| 4 | [4, 1, 3] | 命中 | - |
| 2 | [4, 2, 3] | 替换1 | 最早进的是1 |
| 4 | [4, 2, 3] | 命中 | - |
命中次数:3次,命中率:30%
2. LRU (近期最少使用) 过程:
| 访问块 | Cache状态 | 命中/替换 | 说明 |
|---|---|---|---|
| 1 | [1, , ] | 调入 | 未满 |
| 2 | [1, 2, ] | 调入 | 未满 |
| 1 | [1, 2, ] | 命中 | 1变成最新的 |
| 5 | [1, 2, 5] | 调入 | 5最新 |
| 4 | [1, 5, 4] | 替换2 | 2最旧 |
| 1 | [5, 4, 1] | 命中 | 1变成最新的 |
| 3 | [4, 1, 3] | 替换5 | 5最旧 |
| 4 | [1, 3, 4] | 命中 | 4变成最新的 |
| 2 | [3, 4, 2] | 替换1 | 1最旧 |
| 4 | [3, 2, 4] | 命中 | 4变成最新的 |
命中次数:4次,命中率:40%
总结:
- FIFO命中率较低(30%),可能出现颠簸现象。
- LRU命中率通常优于FIFO(40%),更接近OPT(最优算法)。
【例 6-8扩展】OPT算法模拟
题目描述:
使用【例6-8】的相同条件,分析 OPT(最优替换)算法 的使用情况。
解题过程:
OPT算法需要预知未来,替换未来最长时间内不会被用到的块。
| 访问块 | Cache状态 | 命中/替换 | 说明 |
|---|---|---|---|
| 1 | [1, , ] | 调入 | 未满 |
| 2 | [1, 2, ] | 调入 | 未满 |
| 1 | [1, 2, ] | 命中 | - |
| 5 | [1, 2, 5] | 调入 | 未满 |
| 4 | [1, 2, 4] | 替换5 | 5未来不再使用 |
| 1 | [1, 2, 4] | 命中 | - |
| 3 | [1, 2, 3] | 替换4 | 4未来不再使用 |
| 4 | [1, 3, 4] | 替换2 | 2未来不再使用 |
| 2 | [1, 3, 2] | 替换4 | 4未来不再使用 |
| 4 | [1, 2, 4] | 替换3 | 3未来不再使用 |
命中次数:2次,命中率:20%
注意:虽然OPT命中率看起来不高,但这是在该Cache容量下的理论上限。实际算法(如LRU)的命中率应该以OPT为参考标准。
【例 6-8扩展2】不同Cache容量的影响
题目描述:
使用【例6-8】的访问序列,分析Cache容量为 2块 和 4块 时,LRU算法的命中率。
解题过程:
Cache容量 = 2块时(LRU):
| 访问块 | Cache状态 | 命中/替换 |
|---|---|---|
| 1 | [1, ] | 调入 |
| 2 | [1, 2] | 调入 |
| 1 | [2, 1] | 命中 |
| 5 | [1, 5] | 替换2 |
| 4 | [5, 4] | 替换1 |
| 1 | [4, 1] | 替换5 |
| 3 | [1, 3] | 替换4 |
| 4 | [3, 4] | 替换1 |
| 2 | [4, 2] | 替换3 |
| 4 | [2, 4] | 命中 |
命中次数:2次,命中率:20%
Cache容量 = 4块时(LRU):
| 访问块 | Cache状态 | 命中/替换 |
|---|---|---|
| 1 | [1, , , ] | 调入 |
| 2 | [1, 2, , ] | 调入 |
| 1 | [2, 1, , ] | 命中 |
| 5 | [2, 1, 5, ] | 调入 |
| 4 | [2, 1, 5, 4] | 调入 |
| 1 | [2, 5, 4, 1] | 命中 |
| 3 | [5, 4, 1, 3] | 替换2 |
| 4 | [5, 1, 3, 4] | 命中 |
| 2 | [1, 3, 4, 2] | 替换5 |
| 4 | [1, 3, 2, 4] | 命中 |
命中次数:4次,命中率:40%
结论:Cache容量越大,命中率越高(LRU是堆栈型算法,具有单调性)。
五、虚拟存储器页表
【例 6-10】页表级数计算
题目描述:
虚拟存储空间大小
整个页表共有 4M 个表项,远大于一个页面,所以需要建立多级页表。计算得到页表的级数。
解题过程:
计算一个页面能存放多少个页表项:
(这意味着每一级页表的一个节点只能管下一级的256个节点)
计算总共需要的虚页数(总表项数):
计算级数: 需要多少层
才能覆盖 ? 或者简单理解:
- 一级页表能管
页。 - 二级页表能管
页。 - 三级页表能管
页(大于 ,够用了)。
- 一级页表能管
结果:需要 3级 页表。
关键公式:
- 每页表项数 =
- 总虚页数 =
- 页表级数 =
【例 6-10扩展】页表项大小计算
题目描述:
某系统采用页式虚拟存储管理,虚拟地址32位,物理地址24位,页大小为4KB。每个页表项除了包含物理页号外,还包含有效位、修改位、访问位等控制位,共占用3位。
- 虚拟地址空间有多少页?
- 物理地址空间有多少页?
- 页表项至少需要多少位?
- 如果页表项按字节对齐,每个页表项占多少字节?
解题过程:
虚拟地址空间页数:
- 页大小 = 4KB =
字节 - 页内偏移 = 12位
- 虚页号 = 32 - 12 = 20位
- 虚拟页数 =
页
- 页大小 = 4KB =
物理地址空间页数:
- 页内偏移 = 12位(与虚拟地址相同)
- 实页号 = 24 - 12 = 12位
- 物理页数 =
页
页表项位数:
- 物理页号 = 12位
- 控制位 = 3位
- 总位数 = 12 + 3 = 15位
页表项字节数:
- 按字节对齐,15位需要向上取整到2字节(16位)
- 每个页表项占 2字节
【例 6-10扩展2】TLB命中率计算
题目描述:
某系统采用页式虚拟存储管理,访问主存的时间为100ns,访问TLB的时间为10ns。如果TLB的命中率为95%,求平均地址转换时间。
解题过程:
TLB命中时:
- 只需访问TLB:
- 只需访问TLB:
TLB失效时:
- 需要访问TLB(失效)+ 访问主存页表 + 访问主存数据
- 假设页表也在主存中:
- (注:实际可能只需要访问页表一次,这里假设最坏情况)
平均地址转换时间:
结论:TLB显著提高了地址转换速度。
六、其他可能出现的例题类型
【例 6-9】并行存储系统带宽计算
题目描述:
某计算机采用4体交叉存储系统,每个存储体的存取周期为200ns,数据总线宽度为32位。求该存储系统的最大带宽。
解题过程:
理想情况下的带宽:
- 4体交叉,理论上可以流水线工作
- 每个存储体存取周期 = 200ns
- 在理想流水线情况下,每200ns可以完成4次访问
- 实际访问周期 =
带宽计算:
- 数据宽度 = 32位 = 4字节
- 带宽 =
关键公式:
- 并行存储系统带宽 =
【例 6-11】Cache写策略性能分析
题目描述:
某Cache采用写回法,写命中率为90%,写失效率为10%。已知Cache写操作时间为10ns,主存写操作时间为100ns。如果写失效时采用写分配策略,求平均写操作时间。
解题过程:
写命中时(90%):
- 只写Cache:
- 只写Cache:
写失效时(10%):
- 采用写分配:先调入块(访问主存100ns),再写Cache(10ns)
平均写操作时间:
对比:如果采用写直达法,每次写都需要100ns,平均时间为100ns,明显慢于写回法。
【例 6-12】综合访存流程分析
题目描述:
某系统采用虚拟存储管理,CPU发出虚拟地址后,需要经过TLB、页表、Cache、主存的多级查找。已知:
- TLB命中率:98%,访问时间:1ns
- 页表在主存中,访问时间:100ns
- Cache命中率:95%,访问时间:10ns
- 主存访问时间:100ns
求CPU平均访存时间(假设TLB失效时需访问页表,Cache失效时需访问主存)。
解题过程:
地址转换阶段:
- TLB命中(98%):
- TLB失效(2%):
- 平均地址转换时间:
- TLB命中(98%):
数据访问阶段(在得到物理地址后):
- Cache命中(95%):
- Cache失效(5%):
- 平均数据访问时间:
- Cache命中(95%):
总平均访存时间:
注意:实际系统中,TLB和Cache可能并行查找,时间可能更短。
【例 6-13】存储层次结构容量计算
题目描述:
某计算机存储系统层次结构如下:
- 寄存器:32个,每个32位
- Cache:64KB,块大小64字节
- 主存:256MB
- 辅存:80GB
- 计算各层存储容量(以字节为单位)
- 计算Cache的块数
- 如果主存按字节编址,需要多少位地址?
解题过程:
各层容量:
- 寄存器:
- Cache:64KB =
- 主存:256MB =
- 辅存:80GB =
- 寄存器:
Cache块数:
- 块大小 = 64字节
- Cache块数 =
块
主存地址位数:
- 主存容量 = 256MB =
字节 - 地址位数 = 28位
- 主存容量 = 256MB =
七、解题技巧总结
1. 命中率计算
- 明确区分命中次数、失效次数、总次数
- 公式:
2. 性能参数计算
- 等效访问时间:
- 访问效率:
- 速度比:
3. 地址映像
- 主存块号 =
- 直接映像:Cache行号 = 主存块号
- 组相联:Cache组号 = 主存块号
4. 替换算法
- FIFO:替换最早进入的(队列)
- LRU:替换最久未使用的(堆栈)
- OPT:替换未来最久不用的(理论最优)
5. 页表计算
- 虚页数 =
- 页表级数 =
6. 综合题目
- 按层次逐步计算(TLB → 页表 → Cache → 主存)
- 注意命中/失效的概率叠加
- 考虑并行查找的情况
八、常见易错点
- 命中率与失效率混淆:失效率 = 1 - 命中率
- 地址计算时忘记取整:主存块号需要向下取整
- 组相联的组数计算错误:组数 = Cache总块数 ÷ 路数
- 替换算法状态更新错误:LRU需要更新访问顺序,FIFO命中时不改变顺序
- 页表级数计算:需要向上取整,确保能覆盖所有虚页
- 单位换算错误:注意KB、MB、GB之间的换算(1024倍关系)
本文档涵盖了第6章存储系统设计的主要例题类型,建议结合理论笔记一起复习。