Cache与主存之间的映射

1. Cache概述

1.1 存储器的层次结构

CPU内部的存储器有寄存器、Cache;CPU外部的存储器有主存。
在这里插入图片描述
数据总是在相邻两层之间复制传送,在传送时最小的传送单位为定长块(block,大小为一个page,4K),且数据互为副本。

Upper Level:上层更靠近CPU;
Lower Level:下层更远离CPU。

1.2 为什么引入Cache

大量典型程序的运行情况分析结果表明:

  • 在较短时间间隔内,程序产生的地址往往集中在一个很小的范围内,这种现场称为程序访问的局部性:空间局部性、时间局部性。

程序具有访问局部性特征的原因:

  • 指令:指令按序存放,地址连续,循环程序段或子程序段重复执行。
  • 数据:连续存放,数组元素重复、按序访问。

在CPU和主存之间设置一个快速小容量的存储器,其中总是存放最活跃(被频繁访问)的程序和数据,由于程序访问的局部性特征,大多数情况下,CPU能直接从这个高速缓存中取得指令和数据,而不必访问主存。

这个高速缓存就是位于主存和CPU之间的Cache!

1.3 Cache和主存的关系

在这里插入图片描述

1.4 Cache的操作过程

在这里插入图片描述

2. Cache映射

什么是Cache的映射功能?

  • 把访问的局部主存区域取到Cache中时,该放到Cache的何处?
  • Cache行比主存块少,多个主存块映射到一个Cache行中。

如何进行映射?

  • 把主存空间划分成大小相等的主存块(Block)。
  • Cache中存放一个主存块的对应单位称为槽(Slot)或行(line)。
  • 将主存块和Cache行按照以下三种方式进行映射
    • 直接(Direct):每个主存块映射到Cache的固定行。
    • 全相联(Full Associate):每个主存块映射到Cache的任一行。
    • 组相联(Set Associate):每个主存块映射到Cache固定组中任一行。

2.1 直接映射

  • 把主存的每一块映射到一个固定的Cache行(槽),块(行)都从0开始编号。
  • 也称模映射(Module Mapping)
  • 映射关系为:
    Cache行号=主存块号 mod Cache行数
    例如:4=100 mod 16(假定Cache共有16行)
    (说明:主存第100块应映射到Cache的第4行中。)

直接映射的特点:

  • 容易实现,命中时间短。
  • 无需考虑淘汰(替换)问题。
  • 不够灵活,Cache存储空间得不到充分利用,命中率低。例如,需将主存第0块与第16块同时复制到Cache中时,由于它们都只能复制到Cache第0行,即使Cache其它行空闲,也有一个主存块不能写入Cache。这样就会产生频繁的Cache装入。

在这里插入图片描述

2.1.1 有效位和访存过程

有效位

在这里插入图片描述
“Cache冲刷”指令只有内核可以发出。

访存过程

假设Cache数据区容量为64KB(不包括有效位和tag),每一块(行/槽)为16字节,128位,所以共有4096行。

主存地址划分:

假设主存地址为32位,因为共有4096行需要索引,所以需要12位来存储索引号;一块有16字节128位,按字节编制,所以块内地址需要占用4位;所以tag占用的位数为32-12-4=16位。

访存时,首先根据12位的索引号可以直接找到行数,然后把主存地址中的高16位tag与Cache中的tag内容去比较,如果相当并且有效位为1,这个结果就是命中(指被访问信息存在Cache中),至此锁定行号后,根据4位的块内地址,去找对应的数据位置,假如需要从Cache中取一个4字节的int类型数据,那么4位的块内地址中其实只有高2位有用,因为16字节会被分为4个4字节空间,找到对应空间只需要2位即可寻址成功,假如需要从Cache中取一个字节的Byte类型数据,那么4位的块内地址全都有用,16个字节分为16个字节空间,找到对应空间需要4位才能寻址成功。
在这里插入图片描述

Cache容量计算

一共有4096行,每一行包括1位有效位和16位tag,数据区域一共64KB*8bits,总共为72.5KB。

2.2 全相联映射方式

主存地址为11位,直接在标记位填写上当前槽映射的是主存中哪一块内存,当CPU访问Cache寻找目标数据时,通过一个个比较器同时比较,最后将比较结果进行“或”操作,如果最后结果为1就是命中。例如要访问0x01E0CH单元时,通过比较器将高11位00000001111去和Cache中标记比较,“或”后结果为1,就是命中,命中后根据9位的000001100可以知道访问的是第12个字节单元。

需要多少个比较器?
每行一个比较器!

在这里插入图片描述

2.3 组相联映射

  • 组相联映射结合直接映射和全相联映射的特点。
  • 将Cache所有行分组,把主存块映射到Cache固定组的任一行中。也即:组间模映射、组内全映射。映射关系为:
    Cache组号=主存块号 mod Cache组数
    举例:假定Cache划分为:8K字=8组2行/组512字/行 4=100 mod 8
    (主存第100块应映射到Cache的第4组的任意行中。)

特点:

  • 结合直接映射和全相联映射的优点。当Cache组数为1时,变为相联映射;当每组只有一个槽时,变为直接映射。
  • 每组2或4行(称为2-路或4-路组相联)较常用。通常每组4行以上很少用。在较大容量的L2 Cache和L3 Cache中使用4-路以上。

组相联映射就是将Cache进行分组,原来16个槽分为2路8组,主存将块分组群,每8块为一个组,共255个组群。

主存地址共20位,前面8位标记表示该块Cache映射的是主存哪个组群中的块,中间3位为Cache的组号,块内地址为9位,可索引字节单元为512字节。

例如寻找0x0120CH单元数据,前8位0000 0001代表主存中第一组群的第1块即主存中第9块,中间三位001表示映射到第1组中,然后使用比较器去比较标志,看是否命中,如果命中最后9位000001100代表CPU需要的数据为第12个字节单元。
在这里插入图片描述
目前机器普通采用组相联映射方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值