下面几道题涉及到直接映射、组相联映射、全相联映射

将通过下面几道题的讲解,彻底教会Cache总容量的求法

一、概念了解

1.1 首先,我们需要知道有关Cache的一些概念

Cache为高速缓冲存储器,其工作的方式是,当主存中有内容需要执行时,将其内容复制到cache中,能够加快运行。

有简单学习过这部分内容的同学肯定知道,
一个主存块对应一个Cache行 以及 一个主存块的大小一个Cache行的大小相等,

1.2 那么怎么让主存块对应Cache行呢?(Cache与主存的映射方式)

1.2.1 在这里先介绍一下主存块的内容

既然主存属于存储器,那么他一定有数据部分,如果想找到这样一个主存块,那么他一定有地址部分
可以简单的理解为:主存块 就是 一个有地址的数据。
那么我们只要知道地址,就能快速获取里面的内容。
所以接下来我们就不讨论主存的数据,而是主要讨论主存地址。

1.2.2 讨论主存地址

将主存想象成一栋楼,一个主存块就是某一层,一个主存块内还有若干个字节,其对应于某一层的某一个房间。
想象一下,如果你要想找到一个确定的房间需要一个什么样的过程。

16层501,像这样的一个访问方式就找到了所要寻找的房间,
那么对应寻找主存数据的过程也是这样,先寻找你需要的主存块(主存块号),再确定主存块内的具体地址(块内地址)。

1.2.3 主存地址的构成

所以主存地址由两部分组成:主存块号+块内地址
在这里插入图片描述

1.2.4 Cache行的构成

Cache由 Cache标记(其目的是找到对应的主存块)+数据(对应主存中的数据)构成
(为什么要引入cache标记,而不直接使用主存块号进行对应?
答:因为在cache与主存的映射中,cache通过不同的映射方式可以使用主存块号的部分位数精确的找到某主存块,而不需要使用全部。 这里看不懂没关系,在下面映射部分会深刻体会,见直接映射最后部分)
需要注意:在下面计算时会常常用到这样的概念cache行位数
所以就可以知道cache行位数 = cache标记位数 + 数据位数 +其他注意这里的其他是指一些有效位、修改位之类的

那么cache行和主存块究竟是如何对应的呢?

1.2.5 cache行和主存块的三种映射方式

直接映射、全相联映射、组相联映射

1⃣️ 直接映射

一个主存块对应固定的一个cache行如下图
在这里插入图片描述
直接映射的地址结构(看完直接映射就会理解,具体代入见该部分问题2)
在这里插入图片描述
如果cache行数为8,那么主存块和cache行对应关系如下表、下图,
在这里插入图片描述

主存块号对应的cache行
00
11
22
33
44
…………
604
615
626
…………
1015
1026
1037

这里有两个问题。

  1. 你能否很快速的知道二进制地址为1010011011的主存块 对应的 cache行是哪一个吗?
    答:011 = 3,你太棒了,你发现了里面的规律吗,最后的三位就是对应的cache行
  2. 假如在大小为8的cache中,第3行的cache行知道有一个主存块的前(n-3)位为1001011,那么你能知道这个主存块的精确地址吗
    答:3 = 011. 所以精确地址为1001011 后面 加上011,即1001011011【cache是知道自己的地址的】

解决了根据上面的两个问题,相信你已经理解了直接映射的映射方式。
同时对于在1.2.4中所提到的cache行的标记位,相信你也有了不错的理解,cache行中的标记位就是问题2中的1001011,能够节省3bit的空间

那么再次考虑上述第二题,是否可以理解主存块号=标记+cache行号这个公式了呢

2⃣️全相联映射

每一个主存块能够对应到任意cache行中
先不要看下图,
考虑一下对于这种情况下,cache行中的标记位存储哪些内容,你才能找到精确的主存块?
3
2
1
答:因为我不存在对应关系,所以我必须知道主存块确切的主存块号才能找到一个精确的主存块。
所以 全相联映射的地址结构:主存地址 = 标记 + 块内地址
在这里插入图片描述

3⃣️组相联映射

上面两种的结合体
对cache进行分组,主存块放入特定分组块的任意位置,如下图
在这里插入图片描述
不好理解的话可以这样去考虑
假如cache行位16采用2路组相联映射的话
将cache号 0,1分为第零组;2,3分为第一组;4,5分为第二组;6,7分为第三组……14,15分为第七组,

现在我给一个主存地址,在组之间进行直接映射关系
【意思就是 0=>第0组;1=>第一组;……60=>第四组;61=>第五组;……】

而对于进入进入第0组的0,8,16……这些主存块来说,我是不管你对应的是0号cache还是1号cache的

组相联映射的理解可以类比理解直接映射的理解

因为对于cache来说自己的cache组号是已知的,所以在对主存地址进行划分时,就不用再将cache组号划分进标记字段中了。
所以 全相联映射的地址结构:主存地址 = 标记 + cache组号+ 块内地址(主存块号=标记+cache组号)

开始进行题目的讲解了

经过了基础知识的学习,相信已经对概念比较熟悉了。
下面进行题目实战

题目一:有关全相联映射的题目

在这里插入图片描述
【解】

Cache总容量 = Cache行数 ✖️ Cache行位数

Cache行数

Cache行位数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐