🐳
南软佛脚玩乐指南
Github
  • 欢迎
  • 南软
    • 课程&培养方案介绍
  • 佛脚
    • 微积分 I/II
    • CPL
    • 计算系统基础
    • 软件工程与计算 I
    • 离散数学
    • 需求与商业模式创新
      • 商业模式部分笔记
      • 需求部分笔记
      • 往年卷
    • 线性代数
    • 互联网计算
      • 01-计算机网络及其参考模型
      • 02-物理层
      • 03-数据链路层
      • 04-网络层
      • 05-传输层
      • 06-应用层
      • 07-路由
      • 08-路由协议
      • 09-VLAN
      • 10-广域网 & PPP
      • 11-网络安全 & ACL
      • 12-DHCP
      • 20-复习
      • 21-常见报文汇总
      • 22-往年卷要点汇总
      • 名词解释
      • 大作业要求
      • 实验考试要求
      • 小测及答案
    • 计算机组织结构
      • 01-概述
      • 02-计算机的顶层视图
      • 03-数据表示
      • 04-校验码
      • 05-整数运算
      • 06-浮点运算
      • 07-BCD运算
      • 08-内部存储器
      • 09-Cache
      • 10-外部存储器
      • 11-RAID
      • 12-虚拟存储器
      • 13-指令系统
      • 14-指令流水线
      • 15-控制器
      • 16-总线
      • 17-输入输出
      • 20-复习
      • 机考
        • 2024-12
        • 2020-12
    • 数据结构与算法
    • 密码学原理
    • 计算机系统基础实验选修
  • 玩乐
    • 吃喝
      • 鼓楼周边
      • 仙林周边
      • 南京市内
    • 旅游
      • 春日赏花
      • 宁杭线
  • 交通
  • 指南
    • 获取下载密码
    • 添砖加瓦
由 GitBook 提供支持
在本页
  • 工作流程
  • 判断命中
  • 程序访问局部性
  • 平均访问时间
  • Cache的构成
  • Cache的设计要素
  • 容量
  • 映射方式
  • 替换算法
  • 写策略
  • 行大小
  • Cache数目
  • 注意事项
  • 行优先&列优先
在GitHub上编辑
  1. 佛脚
  2. 计算机组织结构

09-Cache

  • 内存墙:CPU的速度比内存快,且两者差距不断扩大

  • 解决内存墙:在CPU和主存间添加一块小而快的Cache,存放主存中部分信息的“副本”

  • Cache是SRAM

工作流程

  1. 检查:检查CPU要访问的字是否在Cache中

  2. 分情况处理

    • Hit:直接传送

    • Miss:将包含这个字固定大小的块读入Cache,同时从Cache中传送该字给CPU

判断命中

  • Cache通过tags标识内容在主存中的位置

程序访问局部性

  1. 时间局部性:在相对较短的时间内,重复访问特定/相同位置的信息:循环

  2. 空间局部性:在相对较短的时间内,访问相邻的数据

因此:

  • 时间局部性:miss时同时将数据传给Cache和CPU

  • 空间局部性:将块而非字传给Cache

平均访问时间

  • ppp:命中率、TCT_CTC​:Cache访问时间、TMT_MTM​:主存访问时间,则

  • 使用Cache的平均访问时间:TA=p×TC+(1−p)×(TC+TM)=TC+(1−p)×TMT_A=p \times T_C+(1-p) \times (T_C +T_M) = T_C + (1-p) \times T_MTA​=p×TC​+(1−p)×(TC​+TM​)=TC​+(1−p)×TM​

  • ppp越大,TCT_CTC​越小,越快

  • 目的:让TAT_ATA​接近TCT_CTC​,消除内存墙

  • 方法:降低ppp

  • 难点:Cache的容量远远小于主存的容量

Cache的构成

  • Cache控制器:虚框内

  • Cache储存体:SRAM

    • Tag:存放主存的组号

    • Cache:存放对应块的数据信息

Cache的设计要素

容量

  • 扩大Cache容量:

    • ppp增大

    • 但是:TCT_CTC​也增大

映射方式

直接映射

  • 将块映射到固定行

  • iii:Cache行号 jjj:主存行号 CCC :Cache行数,有i=jmod  Ci=j\mod Ci=jmodC

  • 若Cache有2c2^c2c行 每行包含2d2^d2d个字,内存有2m2^m2m个块(2d+m2^{d+m}2d+m个字),需要m−cm-cm−c位区分cache映射到了哪一块

  • 主存地址对应Cache:

Cache标记
Cache行号
块内地址
  • 标记+Cache行号即为块号

  • 优点:简单、快速

  • 缺点:抖动现象(Thrashing):重复访问映射到同一行中的不同行会导致块被来回交换,效率大幅降低

  • 适合大容量Cache

关联映射

  • 主存块装入Cache中任意一行

  • 若Cache有2c2^c2c行 每行包含2d2^d2d个字,内存有2m2^m2m个块(2d+m2^{d+m}2d+m个字)

  • 主存地址对应Cache:

Cache标记/块号
块内地址
  • 优点:避免抖动

  • 缺点:实现复杂、搜索代价O(n)O(n)O(n)

  • 适合小容量Cache

组关联映射

  • Cache分为若干组,每一组包含相同数量的行,每个主存块被映射到固定组的任意一行

  • sss:Cache组号 jjj:主存块号 SSS:组数

  • K-路组关联映射:K=C/SK=C/SK=C/S

  • 若Cache有2c2^c2c行 每行包含2d2^d2d个字 2K2^K2K组,内存有2m2^m2m个块(2d+m2^{d+m}2d+m个字)

  • 主存地址对应Cache:

Cache标记
Cache组号
块内地址
  • 折中不同容量的Cache,优缺点兼备

比较

  • 关联度(Correlation):主存块映射到Cache中可能存放的位置个数

    • 直接映射:111

    • 关联映射:CCC

    • 组关联映射:KKK

  • 关联度越低,命中率越低(直接映射中多个主存块竞争同一个位置造成抖动)

  • 关联度越低,判断是否命中越快

  • 关联度越低,标记所占额外空间开销越小(Cache组号是否提供了主存映射地址的信息)

替换算法

  • 直接映射直接替换,不用选择

  • 关联映射和组关联映射需要选择换哪个块

  • 硬件实现

LRU Least Recently Used 最近最少用

  • 假设:最近使用过的数据块很有可能被再次使用

  • 策略:替换掉Cache中最长时间未被访问的数据块

  • 实现:例:2路组关联映射

    • 每行包含一个USE位

    • 同一组的某一行被访问时 将USE位设为1 将另一个USE位设为0

    • 新数据读入时替换掉USE位为0的行的数据块

FIFO First in First out 先进先出

  • 假设:最近进入Cache的数据很有可能被再次使用

  • 策略:替换掉Cache中停留时间最长的数据块

  • 实现:时间片轮转法/环形缓冲技术

    • 每行包含标识位

    • 同组某行被替换时,将下一行设为0(若被替换的是最后一行,将第一行设为0)

    • 读入新数据时替换掉标识位为0的数据块

Less Frequently Used 最不常用

  • 假设:访问越频繁的数据块越有可能被使用

  • 策略:替换掉Cache中被访问次数最少的数据块

  • 实现:为每一行设置计数器

随机

  • 假设:数据块再次使用的可能性相同

  • 性能稍逊于其他算法

写策略

  • 一致性:Cache中数据块被替换时,需考虑数据块是否被修改

  • 若被修改需写回主存

写直达

  • 所有写操作同时对cache和主存进行

  • 优点:主存中的数据是最新的

  • 缺点:产生大量主存访问、减慢写操作

写回法

  • 仅更新Cache,当替换时写回主存

  • 利用脏位Dirty Bit记录是否被修改

  • 优点:减少访问主存次数

  • 缺点:主存数据不是最新,影响需要从整个存储Hierarchy中当前Cache以下的部分(如I/O)中使用数据的情况

行大小

  • 行大小&命中率关系复杂

  • 行大小从1开始增加,命中率增加:利用空间局部性,覆盖更多相邻块

  • 行大小较大后继续增加,(相同容量的)Cache命中率会下降

    • 行数变少,块数量变少,替换次数增加

    • 每个数据块中包含的数据在主存中位置变远,被使用的可能性减小

Cache数目

一级 vs 多级

  • 一级:片内Cache(Cache和CPU在一个芯片上),减少数据在总线上的传输时间

  • 多级:

    • L1未命中时,减少处理器对总线上DRAM或ROM的访问

    • 使用单独的数据路径,代替系统总线在L2缓存和处理器之间传输数据,减轻系统总线负担

  • 多级的平均访问时间:LiL_iLi​需TiT_iTi​时间访问,L1L_1L1​ - LiL_iLi​联合命中率为PiP_iPi​,TA=T1+∑(1−Pi)×Ti+1+(1−PN)×TMT_A=T_1 + \sum (1-P_i) \times T_{i+1} + (1-P_N) \times T_MTA​=T1​+∑(1−Pi​)×Ti+1​+(1−PN​)×TM​(注意:无论是否hit都要一级一级访问下去)

统一 vs 分立

  • 统一:将数据和指令缓存在同一处

    • 负载平衡,命中率更高

    • 只需设计、实现1个cache

  • 分离:将数据和指令分开缓存

    • 消除cache在取值/译码单元和执行单元的竞争

    • 有利于指令流水线

注意事项

  • 字、块都是从0开始

  • Cache行位数=标记位 + 有效位(1) + 脏位(写直达0 写回1) + 数据位(Byte*8)

行优先&列优先

1, 3, 5
4, 2, 6,
7, 8, 9
  • 行优先:1,3,5,4,2,6,7,8,9

  • 列优先:1,4,7,3,2,8,5,6,9

上一页08-内部存储器下一页10-外部存储器

最后更新于3个月前

位

位

位

位

位

位

位

位

m−cm-cm−c
ccc
ddd
mmm
ddd
m−Km-Km−K
KKK
ddd
Cache的构成