计算机组成原理 —— Cache和主存的映射方式

我们之前了解了存储系统,现在我们的问题就是我们所有的存储的东西都要拿到CPU上去执行,但是主存的读取速度和CPU的读取速度有很大的差异,无法做到很好的平衡。
在这里插入图片描述为了缓解主存和CPU之间速度的矛盾,我们引入了Cache(高速缓存),我们从主存调入CPU时要先经过Cache,然后CPU从Cache读取:
在这里插入图片描述为了更方便的让主存中的数据放到Cache中,我们将Cache分块,主存也分块:
在这里插入图片描述
这样我们想要哪块就可以把哪块放入Cache中,而我们研究的就是这个放入的过程,这个过程我们称之为Cache和主存的映射方式

Cache和主存的映射方式

Cache和主存之间的映射方式是计算机体系结构中的一个重要概念,它决定了主存中的数据如何被放置到Cache中,以及CPU如何从Cache中找到这些数据。映射机制影响了Cache的命中率、访问时间和成本。以下是三种主要的Cache-主存映射方式:

  1. 直接映射(Direct Mapping)
  • 在直接映射中,主存中的每一个块只能映射到Cache中的一个特定位置。具体来说,主存块的地址通过模运算(mod)与Cache的大小相除后的余数,确定了它在Cache中的位置。
  • 这种映射方式的优点是硬件实现简单,因为每个主存块有唯一的一个Cache位置可以对应,寻址逻辑较为直接。
  • 缺点是,如果多个常用主存块映射到同一个Cache位置,就会产生冲突,导致频繁的替换和较低的命中率。
  1. 全相联映射(Fully Associative Mapping)
  • 全相联映射允许主存中的任何块可以映射到Cache中的任意位置。
  • 这种映射提供了最高的灵活性和命中率,因为没有固定的映射关系,可以自由选择Cache中空闲的位置来存储主存块。
  • 然而,全相联映射的缺点是硬件实现成本高,因为每次访问Cache时都需要比较所有Cache行的标记,这会增加访问时间并且需要更复杂的电路设计。
  1. 组相联映射(Set Associative Mapping)
  • 组相联映射是一种折衷方案,它将Cache分割成若干个组,每个组内部是全相联的,而不同组之间是直接映射的。
  • 每个主存块可以映射到特定的一个组内的任意位置,这提供了比直接映射更高的灵活性,同时又避免了全相联映射的高成本和延迟。
  • 组相联映射结合了直接映射的简单性和全相联映射的高命中率,通常使用2-way、4-way等组相联,表示每个组中有2个或4个位置可供映射。

在每种映射方式中,Cache的每一行都包含:

  • 标记(Tag):用于标识存储在该行的数据来自主存的哪一部分。
  • 数据(Data):实际存储的数据或指令。
  • 有效位(Valid Bit):指示该行是否包含有效的数据。
  • 脏位(Dirty Bit):在写回Cache系统中,表示数据是否已经被修改过。

在这里插入图片描述

选择哪种映射方式取决于系统的设计目标,例如性能、成本和功耗等因素。现代处理器通常采用组相联映射,因为它在效率和成本之间取得了良好的平衡。

我们接下来一个一个介绍:

全相联映射(Fully Associative Mapping)

我们用个例子来辅助说明:
在这里插入图片描述拿到这种题我们首先要看的就是:主存被分成了多少块,我们这里总大小是256MB,一个主存块的大小为64B,我们用256MB / 64B = 228 / 2 6 = 222 得到我们的主存需要22位表示:
在这里插入图片描述这样我们可以将主存块放入Cache中,以块为单位进行交换,现在我们可以将主存块放入Cache中:
在这里插入图片描述
为了区分我们的主存块,我们会将主存块的前22位,拿出来作为标识(Tag):
在这里插入图片描述同时,大家想一个问题我们一般会用1,0表示两种状态,到这里我们也可以沿用(1表示Cache块被占了,0表示没有),但是,假设我们调入0号块,0号块的地址全是0,和“空”这种状态(块没有被调入)相冲突,所以我们需要一个标志标志块是否被调入Cache:
在这里插入图片描述有效位为1表示对应位置确实有对应的内存块,0表示没有。
那么CPU是如何访问这些块的呢?
在这里插入图片描述

直接映射(Direct Mapping)

直接映射对应的思想就是哈希表,在直接映射中,主存中的每一个块只能映射到Cache中的一个特定位置:
在这里插入图片描述
我们调入Cache的时候,我们用主存块号 % Cache总块数得到一个特定位置:
在这里插入图片描述
新调入的块会把原来的块覆盖掉:
在这里插入图片描述
我们现在来考虑一个问题,我们的标记是否可以优化?
因为我们是取余操作,每个对应的主存地址都有对应的Cache位置,不会变:
在这里插入图片描述
在这里插入图片描述那么直接映射是如何访存的呢:
在这里插入图片描述

组相联映射(Set Associative Mapping)

组相联映射是一种折中方案,它将Cache分割成若干个组,每个组内部是全相联的,而不同组之间是直接映射的。

一般这种题目,会给出是x路组相连(比如说2路组相连)
在这里插入图片描述和上面直接映射的思想差不多,我们也可以优化标记:
在这里插入图片描述组相联映射的访存方式:
在这里插入图片描述

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 19:22:02       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 19:22:02       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 19:22:02       62 阅读
  4. Python语言-面向对象

    2024-07-17 19:22:02       72 阅读

热门阅读

  1. vue3中常用组件封装及使用

    2024-07-17 19:22:02       21 阅读
  2. SpringBoot+HttpClient实现文件上传下载

    2024-07-17 19:22:02       22 阅读
  3. 根据语义切分视频

    2024-07-17 19:22:02       19 阅读
  4. 量化交易对市场波动的反应机制

    2024-07-17 19:22:02       20 阅读
  5. Html_Css问答集(11)

    2024-07-17 19:22:02       19 阅读
  6. 最全—航班信息管理系统【数组版】

    2024-07-17 19:22:02       18 阅读