Skip to content

第6章 存储系统设计 - 核心例题详解

本文档整理了第6章存储系统设计中的核心例题,包括课件中的必考题目以及其他可能出现的典型题型。


📚 基础知识与参数说明

在开始解题之前,需要先理解以下基本概念、参数符号和核心公式。

一、常用参数符号

1. 性能参数

  • H:命中率 (Hit Rate),H=NhitN
  • Nhit:命中次数
  • Nmiss:失效(未命中)次数
  • N:总访存次数,N=Nhit+Nmiss
  • TC:Cache访问时间(周期)
  • TM:主存访问时间(周期)
  • TA:平均访问时间(等效访问时间)
  • e:访问效率,e=TCTA
  • r:速度比,r=TMTC

2. 地址映像参数

  • 主存块号:主存地址所在的数据块编号
  • Cache行号/组号:Cache中的位置编号
  • 块大小/页大小:数据块或页的字节数
  • Tag(标记):用于地址比较的标记字段
  • Index(索引):Cache行号或组号
  • Offset(偏移):块内或页内偏移地址

3. 虚拟存储参数

  • 虚页号:虚拟地址中的页号
  • 实页号/物理页号:物理地址中的页号
  • 页表项:页表中的每个条目
  • TLB命中率:快表的命中率

二、核心公式汇总

1. 命中率与失效率

H=NhitN=1NmissN

2. 平均访问时间

TA=H×TC+(1H)×TM

3. 访问效率

e=TCTA=1H+(1H)r

其中 r=TMTC 为速度比。

4. 预取技术

  • 预取后失效率:1H=1Hn
  • 预取后命中率:H=H+n1n
  • 其中 n=块大小×重复利用率

5. 地址映像

  • 主存块号主存块号=主存地址块大小
  • 直接映像Cache行号=主存块号(modCache行数)
  • 组相联Cache组号=主存块号(modCache组数)
  • Cache组数组数=Cache总块数路数

6. 页表计算

  • 总虚页数虚存空间页大小
  • 每页表项数页大小页表项大小
  • 页表级数log2(总虚页数)log2(每页表项数)

三、解题思路与方法

1. 性能计算类题目

解题步骤

  1. 明确已知条件(命中次数、失效次数、访问时间等)
  2. 计算命中率 H
  3. 根据公式计算 TAe
  4. 注意单位换算(ns、μs、ms等)

常见题型

  • 给定命中/失效次数,求命中率
  • 给定命中率和访问时间,求平均访问时间和效率
  • 给定效率要求,反求命中率
  • 预取技术对命中率的影响

2. 地址映像类题目

解题步骤

  1. 确定主存地址和块大小,计算主存块号
  2. 确定Cache结构(总块数、路数、组数)
  3. 根据映像方式计算Cache位置
  4. 分析地址结构(Tag、Index、Offset的位数)

常见题型

  • 给定主存地址,求映射到的Cache位置
  • 分析地址结构(各字段位数)
  • 计算Tag字段大小

3. 替换算法类题目

解题步骤

  1. 画出Cache状态表(建议手动画表)
  2. 逐个处理访问序列
  3. 判断命中/失效
  4. 失效时根据算法规则选择替换块
  5. 统计命中次数,计算命中率

关键区别

  • FIFO:替换最早进入的,命中时不改变顺序
  • LRU:替换最久未使用的,命中时更新为最新
  • OPT:替换未来最久不用的(需预知未来)

4. 虚拟存储类题目

解题步骤

  1. 计算虚页数和实页数
  2. 分析页表结构(单级或多级)
  3. 计算页表项大小
  4. 计算TLB命中率对性能的影响

常见题型

  • 页表级数计算
  • 页表项大小计算
  • TLB命中率分析
  • 综合访存流程(TLB + 页表 + Cache + 主存)

四、常见题型分类

  1. 基础计算题:直接套用公式,如命中率、平均访问时间
  2. 综合分析题:需要多个步骤,如预取技术、多级存储
  3. 地址变换题:需要理解地址结构,如映像方式、页表
  4. 算法模拟题:需要手动填表,如替换算法
  5. 综合应用题:涉及多个层次,如TLB+Cache+主存

五、解题注意事项

  1. 单位换算:注意ns、μs、ms、KB、MB、GB之间的换算(1024倍关系)
  2. 取整问题:主存块号需要向下取整,页表级数需要向上取整
  3. 公式选择:根据已知条件选择合适的公式
  4. 状态更新:替换算法中注意FIFO和LRU的状态更新规则不同
  5. 层次关系:理解Cache、主存、辅存之间的层次关系
  6. 命中/失效:明确区分命中次数和失效次数,不要混淆

一、性能参数计算(命中率、时间、效率)

【例 6-1】基础命中率计算

题目描述

假设某计算机的存储系统由Cache和主存组成。某程序执行过程中访存1000次,其中访问Cache失效(未命中)50次,则Cache的命中率是多少?

解题过程

  1. 分析数据

    • 访存总次数 N=1000 次。
    • 失效(Miss)次数 Nmiss=50 次。
    • 因此,命中(Hit)次数 Nhit=100050=950 次。
  2. 计算公式

    H=NhitN=9501000=0.95
  3. 结果:Cache的命中率为 95%

关键公式

  • 命中率:H=NhitN=1NmissN

【例 6-2】综合性能计算(必考题)

题目描述

CPU执行一段程序时,Cache完成存取的次数为5000次,主存完成存取的次数为200次。已知Cache存储周期 TC 为40ns,主存存取周期 TM 为160ns。分别求:

  1. Cache的命中率 H
  2. 等效访问时间 TA
  3. Cache-主存系统的访问效率 e

解题过程

  1. 求命中率 H

    • Cache完成次数即命中次数:Nhit=5000
    • 主存完成次数即失效次数:Nmiss=200
    • 总访存次数:N=5000+200=5200
    H=500052000.96(96%)
  2. 求等效访问时间 TA

    • 公式:TA=H×TC+(1H)×TM
    • 代入数据:TA=0.96×40ns+(10.96)×160nsTA=38.4+0.04×160TA=38.4+6.4=44.8ns
  3. 求访问效率 e

    • 公式:e=TCTA
    • 代入数据:e=4044.80.893(89.3%)

关键公式

  • 等效访问时间:TA=H×TC+(1H)×TM
  • 访问效率:e=TCTA=1H+(1H)r,其中 r=TMTC 为速度比

【例 6-3】速度比与效率的关系

题目描述

假设 T2=5T1(即主存周期是Cache的5倍),在命中率 H0.90.99 两种情况下,分别计算存储系统的访问效率。

解题过程

使用效率公式推导形式(设速度比 r=T2/T1=5):

e=1H+(1H)r
  1. H=0.9

    e1=10.9+(10.9)×5=10.9+0.5=11.40.714

    (课件结果取为 0.72)

  2. H=0.99

    e2=10.99+(10.99)×5=10.99+0.05=11.040.96

结论:命中率越高,系统效率越高。当速度比 r 很大时,命中率的小幅提升会带来效率的显著改善。


【例 6-4】虚拟存储器的极端情况

题目描述

在虚拟存储系统中,两级存储器的速度相差特别悬殊 T2=105T1。如果要使访问效率 e=0.9,问需要有多高的命中率?

解题过程

  1. 列出公式

    e=1H+(1H)r

    代入已知数值:0.9=1H+(1H)105

  2. 求解 H

    H+(1H)105=10.91.111111H+100000100000H=1.11111110000099999H=1.11111199999H=1000001.111111=99998.888889H0.999999

结论:在虚存系统中,命中率必须极高(接近100%),否则效率会急剧下降。这说明了虚拟存储系统对命中率的极高要求。


二、预取技术与性能提升

【例 6-5】预取对命中率的影响

题目描述

在一个Cache存储系统中,当Cache的块大小为一个字时,命中率 H=0.8;假设数据的重复利用率为5。

  1. 计算块大小为 4个字 时,Cache存储系统的命中率是多少?
  2. 假设 T2=5T1,分别计算块大小为1字和4字时的访问效率。

解题过程

  1. 计算新命中率 H

    • 预取技术会让不命中率降低 n 倍。这里 n=块大小×重复率=4×5=20
    • 根据课件公式(基于失效率降低):1H=1Hn1H=10.820=0.01H=10.01=0.99(或者使用课件上的另一公式 H=H+n1n=0.8+1920=0.99)
  2. 计算效率 e

    • 块大小=1字时 (H=0.8)e1=10.8+(10.8)×5=11.80.55
    • 块大小=4字时 (H=0.99)e2=10.99+(10.99)×5=11.040.96

关键公式

  • 预取后失效率:1H=1Hn,其中 n=块大小×重复利用率
  • 预取后命中率:H=H+n1n

【例 6-6】反求重复利用率

题目描述

在一个虚拟存储系统中,T2=105T1,原来的命中率只有0.8。如果访问磁盘存储器的数据块大小为4K字,并要求访问效率不低于0.9,计算数据在主存储器中的 重复利用率 至少为多少?

解题过程

  1. 先求目标命中率: 根据【例6-4】的结论,在 T2=105T1e=0.9 时,需要的命中率 Htarget0.999999

  2. 利用预取公式求重复率 m

    • 设数据块大小为 S=4096 (4K),重复率为 m
    • 总倍数 n=S×m=4096m
    • 利用失效率降低公式:1Htarget=1Holdn10.999999=10.84096×m0.000001=0.24096mm=0.24096×0.000001=0.20.00409648.8
    • (注:课件中直接代入计算得出的结果是 44,可能是中间精度取舍略有差异,考试时按课件逻辑即可:重复利用率需达到几十次级别)

结论:要达到高访问效率,数据在主存中的重复利用率必须很高(通常需要几十次以上)。


三、地址映像(找位置)

【例 6-7】组相联映射计算

题目描述

某计算机的Cache共有 16块,采用 2路组相联 映像方式(即每组2块)。每个主存块大小为 32字节,按字节编址。

问:主存129号单元 所在的主存块应装入到的 Cache组号 是多少?

解题过程

  1. 求主存块号

    主存块号=主存地址块大小=12932=4

    (即第4块,因为 0~31是第0块,32~63是第1块... 128~159是第4块)

  2. 求Cache的组数

    组数=Cache总块数路数=162=8 (组0组7)
  3. 计算映射组号

    组号=主存块号(mod组数)组号=4(mod8)=4

结果:该主存块只能装入Cache的 第4组

关键公式

  • 主存块号 = 主存地址块大小
  • Cache组数 = Cache总块数路数
  • Cache组号 = 主存块号 (mod组数)

【例 6-7扩展】直接映像地址计算

题目描述

某Cache采用直接映像方式,Cache容量为8KB,块大小为32字节。主存容量为256KB,按字节编址。

  1. 主存地址需要多少位?
  2. Cache地址需要多少位?
  3. 主存地址129应映射到Cache的哪一行?

解题过程

  1. 主存地址位数

    • 主存容量 = 256KB = 218 字节
    • 主存地址位数 = 18位
  2. Cache地址位数

    • Cache容量 = 8KB = 213 字节
    • Cache地址位数 = 13位
  3. 地址结构分析

    • 块大小 = 32字节 = 25 字节,块内偏移 = 5位
    • Cache行数 = 8KB32B=256=28,行号 = 8位
    • 主存块数 = 256KB32B=8192=213
    • 区数 = 21328=25=32,区号 = 5位
  4. 主存地址129的映射

    • 主存块号 = 12932=4
    • Cache行号 = 4(mod256)=4
    • 结果:映射到Cache的第4行

地址结构

  • 主存地址:区号(5位) | 行号(8位) | 块内偏移(5位)
  • Cache地址:行号(8位) | 块内偏移(5位)

【例 6-7扩展2】全相联映射地址结构

题目描述

某Cache采用全相联映像方式,Cache容量为4KB,块大小为64字节。主存容量为1MB。

  1. 主存地址需要多少位?
  2. 地址结构中Tag字段需要多少位?

解题过程

  1. 主存地址位数

    • 主存容量 = 1MB = 220 字节
    • 主存地址位数 = 20位
  2. 地址结构分析

    • 块大小 = 64字节 = 26 字节,块内偏移 = 6位
    • 主存块数 = 1MB64B=16384=214
    • Tag字段 = 20 - 6 = 14位

地址结构

  • 主存地址:Tag(14位) | 块内偏移(6位)
  • Cache中需要存储完整的Tag用于比较

四、替换算法(模拟填表)

【例 6-8】替换算法模拟

题目描述

一个程序共有5个块组成,程序执行过程中的块地址流如下:

1, 2, 1, 5, 4, 1, 3, 4, 2, 4

假设分配给这个程序的Cache存储器共有 3个块。分析 FIFOLRU 的使用情况(是否命中、是否替换)。

解题过程(建议手动画表):

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]替换22最旧
1[5, 4, 1]命中1变成最新的
3[4, 1, 3]替换55最旧
4[1, 3, 4]命中4变成最新的
2[3, 4, 2]替换11最旧
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]替换55未来不再使用
1[1, 2, 4]命中-
3[1, 2, 3]替换44未来不再使用
4[1, 3, 4]替换22未来不再使用
2[1, 3, 2]替换44未来不再使用
4[1, 2, 4]替换33未来不再使用

命中次数: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】页表级数计算

题目描述

虚拟存储空间大小 Nv=4GB,页的大小 Np=1KB,每个页表存储字占用 4个字节

整个页表共有 4M 个表项,远大于一个页面,所以需要建立多级页表。计算得到页表的级数

解题过程

  1. 计算一个页面能存放多少个页表项

    每页表项数=页大小页表项大小=1KB4B=10244=256=28

    (这意味着每一级页表的一个节点只能管下一级的256个节点)

  2. 计算总共需要的虚页数(总表项数)

    总虚页数=虚存空间页大小=4GB1KB=4M=222
  3. 计算级数: 需要多少层 28 才能覆盖 222

    级数=总地址位数页内偏移位数单页索引位数=228=3

    或者简单理解:

    • 一级页表能管 28 页。
    • 二级页表能管 28×28=216 页。
    • 三级页表能管 28×28×28=224 页(大于 222,够用了)。

结果:需要 3级 页表。

关键公式

  • 每页表项数 = 页大小页表项大小
  • 总虚页数 = 虚存空间页大小
  • 页表级数 = log2(总虚页数)log2(每页表项数)

【例 6-10扩展】页表项大小计算

题目描述

某系统采用页式虚拟存储管理,虚拟地址32位,物理地址24位,页大小为4KB。每个页表项除了包含物理页号外,还包含有效位、修改位、访问位等控制位,共占用3位。

  1. 虚拟地址空间有多少页?
  2. 物理地址空间有多少页?
  3. 页表项至少需要多少位?
  4. 如果页表项按字节对齐,每个页表项占多少字节?

解题过程

  1. 虚拟地址空间页数

    • 页大小 = 4KB = 212 字节
    • 页内偏移 = 12位
    • 虚页号 = 32 - 12 = 20位
    • 虚拟页数 = 220=1M
  2. 物理地址空间页数

    • 页内偏移 = 12位(与虚拟地址相同)
    • 实页号 = 24 - 12 = 12位
    • 物理页数 = 212=4K
  3. 页表项位数

    • 物理页号 = 12位
    • 控制位 = 3位
    • 总位数 = 12 + 3 = 15位
  4. 页表项字节数

    • 按字节对齐,15位需要向上取整到2字节(16位)
    • 每个页表项占 2字节

【例 6-10扩展2】TLB命中率计算

题目描述

某系统采用页式虚拟存储管理,访问主存的时间为100ns,访问TLB的时间为10ns。如果TLB的命中率为95%,求平均地址转换时间。

解题过程

  1. TLB命中时

    • 只需访问TLB:Thit=10ns
  2. TLB失效时

    • 需要访问TLB(失效)+ 访问主存页表 + 访问主存数据
    • 假设页表也在主存中:Tmiss=10+100+100=210ns
    • (注:实际可能只需要访问页表一次,这里假设最坏情况)
  3. 平均地址转换时间

    Tavg=HTLB×Thit+(1HTLB)×TmissTavg=0.95×10+0.05×210Tavg=9.5+10.5=20ns

结论:TLB显著提高了地址转换速度。


六、其他可能出现的例题类型

【例 6-9】并行存储系统带宽计算

题目描述

某计算机采用4体交叉存储系统,每个存储体的存取周期为200ns,数据总线宽度为32位。求该存储系统的最大带宽。

解题过程

  1. 理想情况下的带宽

    • 4体交叉,理论上可以流水线工作
    • 每个存储体存取周期 = 200ns
    • 在理想流水线情况下,每200ns可以完成4次访问
    • 实际访问周期 = 200ns4=50ns
  2. 带宽计算

    • 数据宽度 = 32位 = 4字节
    • 带宽 = 4字节50ns=80MB/s

关键公式

  • 并行存储系统带宽 = 数据宽度×体数存取周期

【例 6-11】Cache写策略性能分析

题目描述

某Cache采用写回法,写命中率为90%,写失效率为10%。已知Cache写操作时间为10ns,主存写操作时间为100ns。如果写失效时采用写分配策略,求平均写操作时间。

解题过程

  1. 写命中时(90%)

    • 只写Cache:Twrite_hit=10ns
  2. 写失效时(10%)

    • 采用写分配:先调入块(访问主存100ns),再写Cache(10ns)
    • Twrite_miss=100+10=110ns
  3. 平均写操作时间

    Tavg=0.9×10+0.1×110=9+11=20ns

对比:如果采用写直达法,每次写都需要100ns,平均时间为100ns,明显慢于写回法。


【例 6-12】综合访存流程分析

题目描述

某系统采用虚拟存储管理,CPU发出虚拟地址后,需要经过TLB、页表、Cache、主存的多级查找。已知:

  • TLB命中率:98%,访问时间:1ns
  • 页表在主存中,访问时间:100ns
  • Cache命中率:95%,访问时间:10ns
  • 主存访问时间:100ns

求CPU平均访存时间(假设TLB失效时需访问页表,Cache失效时需访问主存)。

解题过程

  1. 地址转换阶段

    • TLB命中(98%):TTLB_hit=1ns
    • TLB失效(2%):TTLB_miss=1+100=101ns
    • 平均地址转换时间:Taddr=0.98×1+0.02×101=2.98ns
  2. 数据访问阶段(在得到物理地址后):

    • Cache命中(95%):TCache_hit=10ns
    • Cache失效(5%):TCache_miss=100ns
    • 平均数据访问时间:Tdata=0.95×10+0.05×100=14.5ns
  3. 总平均访存时间

    Ttotal=Taddr+Tdata=2.98+14.5=17.48ns

注意:实际系统中,TLB和Cache可能并行查找,时间可能更短。


【例 6-13】存储层次结构容量计算

题目描述

某计算机存储系统层次结构如下:

  • 寄存器:32个,每个32位
  • Cache:64KB,块大小64字节
  • 主存:256MB
  • 辅存:80GB
  1. 计算各层存储容量(以字节为单位)
  2. 计算Cache的块数
  3. 如果主存按字节编址,需要多少位地址?

解题过程

  1. 各层容量

    • 寄存器:32×32=1024=128字节
    • Cache:64KB = 64×1024=65536字节
    • 主存:256MB = 256×1024×1024=268435456字节
    • 辅存:80GB = 80×10243字节
  2. Cache块数

    • 块大小 = 64字节
    • Cache块数 = 64KB64B=1024
  3. 主存地址位数

    • 主存容量 = 256MB = 228 字节
    • 地址位数 = 28位

七、解题技巧总结

1. 命中率计算

  • 明确区分命中次数、失效次数、总次数
  • 公式:H=NhitN=1NmissN

2. 性能参数计算

  • 等效访问时间:TA=H×TC+(1H)×TM
  • 访问效率:e=TCTA=1H+(1H)r
  • 速度比:r=TMTC

3. 地址映像

  • 主存块号 = 主存地址块大小
  • 直接映像:Cache行号 = 主存块号 (modCache行数)
  • 组相联:Cache组号 = 主存块号 (modCache组数)

4. 替换算法

  • FIFO:替换最早进入的(队列)
  • LRU:替换最久未使用的(堆栈)
  • OPT:替换未来最久不用的(理论最优)

5. 页表计算

  • 虚页数 = 虚存空间页大小
  • 页表级数 = log2(虚页数)log2(每页表项数)

6. 综合题目

  • 按层次逐步计算(TLB → 页表 → Cache → 主存)
  • 注意命中/失效的概率叠加
  • 考虑并行查找的情况

八、常见易错点

  1. 命中率与失效率混淆:失效率 = 1 - 命中率
  2. 地址计算时忘记取整:主存块号需要向下取整
  3. 组相联的组数计算错误:组数 = Cache总块数 ÷ 路数
  4. 替换算法状态更新错误:LRU需要更新访问顺序,FIFO命中时不改变顺序
  5. 页表级数计算:需要向上取整,确保能覆盖所有虚页
  6. 单位换算错误:注意KB、MB、GB之间的换算(1024倍关系)

本文档涵盖了第6章存储系统设计的主要例题类型,建议结合理论笔记一起复习。