缓存中"block size"的概念



我刚刚开始学习直接映射和设置关联缓存的概念。我有一些非常基本的疑问。这里。

假设地址是32位长,我有一个32KB的缓存,64Byte块大小和512帧,有多少数据实际存储在"块"内?如果我有一个指令,从一个值从内存位置加载,如果该值是一个16位的整数,它是一个64Byte块现在只存储一个16位(2Bytes)整数值。块中的其他62个字节呢?如果我现在有另一个加载指令,它也加载一个16位整数值,这个值现在进入另一个帧的另一个块,这取决于加载地址(如果地址映射到前一个指令的同一帧,那么前一个值被驱逐,块再次在64字节中仅存储2字节)。正确吗?

请原谅我,如果这看起来像一个非常愚蠢的疑问,这只是我想得到我的概念正确。

我写这封邮件是为了让别人解释缓存,但我认为你可能也会发现它很有用。

您有32位地址,可以引用RAM中的字节。您希望能够缓存您访问的数据,以便以后使用它们。

假设你想要一个1-MiB (220字节)的缓存。

你是做什么的?

你需要满足2个限制:

  1. 缓存应该在所有地址中尽可能统一。也就是说,你不想偏向于任何一种特定的地址。
    • 你是怎么做到的?用剩下的!使用mod,您可以在您想要的任何范围内均匀分布任何整数。
  2. 您希望帮助最小化簿记成本。这意味着,如果你在1字节的块中缓存,你不希望存储4字节的数据只是为了跟踪1字节的位置。
      你是怎么做到的?您存储的块大于1字节。

假设您选择16字节(24-byte)块。这意味着你可以缓存220/24 = 216 = 65,536块数据。

你现在有几个选项:

  • 您可以设计缓存,以便来自任何内存块的数据可以存储在任何缓存块中。这将被称为全关联缓存。
  • 好处是它是"最公平"的一种缓存:所有的块都被完全平等地对待。权衡是速度:为了找到放置内存块的位置,您必须搜索每个缓存块以寻找可用空间。这真的很慢。
  • 您可以设计缓存,以便来自任何内存块的数据只能存储在单个缓存块中。这被称为直接映射缓存。
  • 好处是它是最快的一种缓存:你只需要做一次检查,看看项目是否在缓存中。
  • 的权衡是,现在,如果你碰巧有一个坏的内存访问模式,你可以有两个块踢对方先后,与未使用的块仍然留在缓存中。
  • 您可以将两者混合使用:将单个内存块映射到多个块。这就是真正的处理器所做的——它们有n路集合关联缓存。

Direct-mapped缓存:

现在你有65,536块数据,每个块16字节。
您将其存储为65,536"行"在您的缓存中,每"行"由数据本身组成,以及元数据(关于块所属的位置,是否有效,是否被写入等)。

问题:内存中的每个块如何映射到缓存中的每个块?

回答:你使用的是直接映射的缓存,使用mod。这意味着地址0到15将映射到缓存中的块0;16-31被映射到block 2,等等…当你到达1-MiB标记时,它会绕过来。

那么,给定内存地址M,你如何找到行号N?简单:N = M % 220/24.
但这只告诉您在哪里存储数据,而不告诉您如何检索数据。一旦您存储了它,并尝试再次访问它,您必须知道这里存储了哪一个 1 mb的内存部分,对吗?

这是一个元数据:标签位。如果它在第N行,你所需要知道的就是在取模过程中是什么。对于32位地址,它是12位(因为余数是20位)。

所以你的标签变成了12位长——特别是,任何内存地址的最上面的 12位。
您已经知道,最低的4位用于块内的偏移(因为内存是字节寻址的,而块是16字节)。
这就为内存地址的"索引"位留下了16位,它可以用来查找地址所属的行。(这只是一个除+余运算,但是是二进制的。)

你还需要其他位:例如,你需要知道一个块实际上是否有效,因为当CPU打开时,它包含无效数据。所以你添加1位元数据:有效位。

还有其他一些你会学到的,用于优化,同步等…但这些是最基本的。:)

我假设您了解标签、索引和偏移量的基础知识,但这里是我在计算机体系结构课程中学到的简短解释。块被替换为64字节块,因此每次将新块放入缓存时,它都会替换所有64字节,无论您是否只需要一个字节。这就是为什么在对缓存进行寻址时,有一个偏移量指定您想从块中获取的字节。举个例子,如果只加载16位整数,缓存将根据索引搜索块,检查标签以确保它是正确的数据,然后根据偏移量获得字节。现在,如果你加载另一个16位的值,假设使用相同的索引但不同的标签,它将用新的块替换64字节块,并从指定的偏移量中获取信息。(假设直接映射)

我希望这对你有帮助!如果你需要更多的信息,或者这仍然是模糊的,让我知道,我知道几个很好的网站,做得很好的工作,教这个

最新更新