cache-主存的三种映射方式

1. 基本概念

1. 存储系统的体系结构

在这里插入图片描述
图片摘自这篇博客:图片来源

2. cache在存储系统中的位置

在这里插入图片描述
cache(缓存)位于CPU内部,其读取速度快于主存,但容量小于主存。cache中存放的是程序需要用到的数据,CPU处理时直接从cache中读取数据速度要快于从主存中读取。

在CPU和主存之间引入cache是为了:

①避免CPU与外部设备争抢主存
外设向主存请求数据级别高于CPU,可能导致CPU等待较长时间。
②提高取指令和取数据的速度
主存速度提高跟不上CPU的发展速度,差距总在5倍以上。

3. 程序访问的局部性原理

之所以可以把CPU当前需要的数据和程序放在cache中,是因为程序访问具有局部性的原理:

时间局部性 一个存储单元被访问,此单元很快就会再次被访问

空间局部性 一个存储单元被访问,该单元临近的单元也可能很快被访问。

4. 命中率

如果访问的数据在cache中,称为访问cache命中。

设某Cache的命中率为h,其中访问Cache的时间为tc,访问M的时间为tm。设Nc访问cache命中的总次数,Nm表示访问cache不命中而访问M的次数,则有:
h=Nc/(Nc+Nm)×100%
①若CPU在访问cache不命中时再访问主存
平均访存时间ta=h·tc+(1-h)·(tc+tm)=tc+(1-h)·tm
②若CPU同时访问cache和主存,访问命中时中止对主存的访问。
平均访存时间ta=h·tc+(1-h)·tm

5. 字、字块、标记、组

:1个字由n个字节组成(n≥1),字是CPU访问存储器时可存取的最小单位

字块 :1个字块包含n个字(n≥1),字块是主存与cache交换的最小单位

也就是说,cache和主存在交换时是以字块为单位的,一次交换一个字块(包含好多个字,利用到了局部性原理)。而CPU在访问cache时,一次只存取一个字。

标记 :cache中存放的主存块地址称为标记。

:多个字块组成的一个逻辑整体称为组。

2. cache-主存的三种映射方式

2.1 全相联映射

思路

允许主存中的每个字块映像到cache的任何一个字块位置上。

示意图

在这里插入图片描述
主存地址和cache地址

设置主存地址和cache地址的一个目的是,可以通过主存地址来找到cache地址,这样才能实现主存和cache字块的交换。

主存地址:

包括块标记字块内地址两部分,其中块标记相当于字块在主存中的地址,字块内地址为字块中某个字的地址。

示意图:
在这里插入图片描述
cache地址:

包括字块号字块内地址,其中,字块号为字块在cache中的地址,字块内地址为字块中某个字的地址。

注意:主存地址和cache地址中的字块内地址相同。

示意图:

在这里插入图片描述
相联存储器:

既然全相联映射方式的思路是:主存中的字块映射在cache中的任一字块,计算机怎么知道映射到哪一字块了?到时候怎么操作呢?这就需要一个目录表来查找主存中的某一字块与cache中某一字块的对应关系:

在这里插入图片描述
该目录表由三部分组成:主存字块标记(主存地址的第一部分),cache字块地址(cache地址的第一部分),有效位(1位)。目录表的行数为cache的字块数,这很好理解,因为目录表的目的就是查找主存字块和cache字块的对应关系。

特点

(1)映像方式灵活,主存中的一个字块可以对应cache的任意一块;
(2)主存地址映射到cache无规则可言,必须使用相联存储器通过按内容查找获取cache块号。
(3) 全部由硬件实现,速度快,但硬件实现难度大;
(4)由于使用相联存储器存储目录表,成本高。当cache容量越大时,所需相联存储器的容量也越大,成本也越高。仅适用于小容量cache采用。

2.2 直接映射方式

思路

主存中的一块只能拷贝到cache中的一个特定行位置。设主存的块号为i,cache中的块号为j,cache的总块数为N,则映射关系为:
j = i mod N

示意图

在这里插入图片描述
主存地址与cache地址

主存地址:

包括块标记、字块地址、字块内地址三部分。其中,块标记为字块在主存中的地址,字块地址为字块在cache中的地址(计算方法就是上面说的),字块内地址为字在字块中的地址。

因此这种映射方法不需要目录表了。(因为主存地址中存有要映射到cache相应字块的字块地址了)

示意图:

在这里插入图片描述
cache地址:

包括字块地址字块内地址两部分:其中,字块地址为字块在cache中的地址,字块内地址为字在字块中的地址。

注意:cache地址中的字块地址字块内地址和主存地址中的相同。

示意图:

在这里插入图片描述
特点

(1)映像函数简单,实现硬件简单,无需相联存储器,实现成本较全相联映像方式低;
(2)地址变换速度快,如果命中且字块有效,那么主存地址去掉区号后的低位部分就是cache地址。
(3)块冲突率高,当两个或两个以上的主存块映射到相同的cache发生冲突时,即使其他cache块空闲也不能被使用。当两块交替映射到同一cache时,造成频繁置换——抖动。

2.3 组相联映射方式

思路

组相联映像方式为前两种方式的折衷。其方法是将cache按某种规格分组,主存中若干字块映射到同一个组中,组间为直接映像方式,组内为全相联映像。

主存字块在cache组号求法为:主存字块号 mod cache组数
示意图

在这里插入图片描述
主存地址和cache地址

主存地址:

主存地址包括主存字块标记、组号字块内地址三部分。其中主存字块标记为字块在主存中的地址,组号为cache分的组的组号,字块内地址为字在字块中的地址。

示意图:
在这里插入图片描述
cache地址:

cache地址包括组号、字块号字块内地址三部分组成。其中,组号为cache分组的组号,字块号为每组内字块的地址,字块内地址为字在字块中的地址。

注意:主存地址和cache地址中的组号字块内地址相同。

示意图:

在这里插入图片描述
特点

(1)因为是两种映像方式的折衷,因此地址结构较为复杂,比较的情况较多,需要引入相联存储器;
(2) 兼顾了映像的灵活性和操作的复杂程度。
(3)目前应用较多。每组具有v个字块的组相联映像方式常称为v路组相联。v一般取值较小,典型值有2、4、8、16。

3. 三种映射方式例题

【例题】

设主存容量为256K字,cache容量为2K字,块长为4,按字编制。
①设计cache地址格式,cache可装入多少块数据。
②在直接映射方式下,设计主存地址格式。
③在四路组相联映射方式下,设计主存地址格式
④在全相联映射方式下,设计主存地址格式

【解答】

因为是按字节编址,所以主存地址有18位,cache地址有11位,因为块长为4,说明每个字块有4个字,故字块内地址为2位。

① 字块内地址为2位,故字块地址有11-2=9位,cache地址如下:
在这里插入图片描述
② 直接映射方式下,主存地址包括主存字块标号字块地址字块内地址3部分,其中字块地址和字块内地址与cache地址相同,故主存字块标号有18-11=7位。主存地址如下:

在这里插入图片描述
③ 四路组相联,说明cache分为4个组,此时cache地址包括:组号、字块地址、字块内地址三部分

因为分为4组,故组号为2位,因为一个字块长4位,故字块内地址为2位,故字块地址为11-2-2=7位,cache地址如下:

在这里插入图片描述
此时主存地址由三部分组成:主存字块标记、组号、字块内地址。

组号和字块内地址和cache地址相同(共7+2=9位),故主存字块标记有18-9=9位,主存地址如下:

在这里插入图片描述
④ 全相联方式下,主存地址由主存字块标记和字块内标记组成,字块内标记和cache地址相同,为2位,故主存字块标记为18-2=16位,主存地址如下:

在这里插入图片描述

  • 62
    点赞
  • 332
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
全相连Cache映射是一种Cache映射方式,它的设计过程包括以下几个步骤: 1. 确定Cache的大小和Cache行的大小 全相连Cache映射方式主存中的每一个字节都映射Cache中的一个Cache行中,因此,Cache的大小和Cache行的大小需要根据主存大小和字节大小来确定。一般情况下,Cache的大小和Cache行的大小都是2的整数次幂,如64KB、128KB等。 2. 确定Cache行的结构 每个Cache行包括一个标签和一个数据块,因此需要设计一个结构体来表示Cache行,如下所示: ```verilog typedef struct { logic [31:0] tag; //标签 logic [31:0] data; //数据块 } cache_line_t; ``` 其中,标签用于标识主存中的地址,数据块用于存储主存中的数据。 3. 确定Cache的结构 全相连Cache由多个Cache行组成,因此需要定义一个二维数组来表示Cache,如下所示: ```verilog cache_line_t cache [CACHE_SIZE][CACHE_WAY]; ``` 其中,CACHE_SIZE表示Cache的大小,CACHE_WAY表示每个Cache行包含的数据块个数。 4. 确定Cache的读操作和写操作 当CPU发出一个读操作时,需要将主存地址映射Cache中对应的Cache行,并返回相应的数据块。当CPU发出一个写操作时,需要将主存地址映射Cache中对应的Cache行,并将数据写入到Cache中。读操作和写操作的实现可以采用遍历所有Cache行的方式,找到匹配的Cache行并返回相应的数据块或将数据写入到相应的Cache行中。读操作和写操作的实现可以参考以下代码: ```verilog function logic [31:0] cache_read (logic [31:0] addr); logic [31:0] tag = addr >> CACHE_OFFSET_BITS; logic [31:0] index = addr[CACHE_INDEX_BITS - 1 : CACHE_OFFSET_BITS]; logic [31:0] offset = addr[CACHE_OFFSET_BITS - 1 : 0]; for (int i = 0; i < CACHE_WAY; i++) begin if (cache[index][i].tag == tag) begin return cache[index][i].data[offset +: 4]; end end return main_memory[addr]; endfunction task cache_write (logic [31:0] addr, logic [31:0] data); logic [31:0] tag = addr >> CACHE_OFFSET_BITS; logic [31:0] index = addr[CACHE_INDEX_BITS - 1 : CACHE_OFFSET_BITS]; logic [31:0] offset = addr[CACHE_OFFSET_BITS - 1 : 0]; for (int i = 0; i < CACHE_WAY; i++) begin if (cache[index][i].tag == tag) begin cache[index][i].data[offset +: 4] = data; return; end end main_memory[addr] = data; endtask ``` 其中,CACHE_OFFSET_BITS和CACHE_INDEX_BITS表示主存地址中用于表示偏移量和索引的位数。 5. 确定Cache的替换策略 当Cache行已满时,需要替换一个Cache行以腾出空间存储新的数据块。全相连Cache可以使用LRU替换策略或随机替换策略。LRU替换策略将最近最少使用的Cache行替换掉,随机替换策略随机选择一个Cache行进行替换。 6. 确定Cache的写回策略 当CPU修改某个数据块时,需要将修改的数据块写回到主存中。全相连Cache可以使用写回策略或写直达策略。写回策略将修改的数据块暂时保存在Cache中,当Cache行被替换时才将修改的数据块写回到主存中;写直达策略将修改的数据块立即写回到主存中。 7. 确定Cache的写分配策略 当CPU将某个未在Cache中的数据块写入到Cache中时,需要先将这个数据块从主存中读取到Cache中。全相连Cache可以使用写分配策略或非写分配策略。写分配策略将未在Cache中的数据块先读取到Cache中,再进行写操作;非写分配策略直接将数据块写入到主存中,不进行Cache的读取操作。 综上所述,全相连Cache映射的设计过程包括确定Cache的大小和Cache行的大小、确定Cache行的结构、确定Cache的结构、确定Cache的读操作和写操作、确定Cache的替换策略、确定Cache的写回策略以及确定Cache的写分配策略。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SinHao22

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值