缓存中"块大小"的概念

hek*_*tor 10 caching operating-system

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

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

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

Meh*_*dad 28

我输入此电子邮件给某人解释缓存,但我认为您可能会发现它也很有用.

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

假设你想要一个1-MiB(2 20字节)的缓存.

你是做什么?

您需要满足以下2个限制:

  1. 缓存应尽可能在所有地址中统一.即你不想偏向任何特定类型的地址.
    • 你怎么做到这一点?使用剩余!使用mod,您可以在任何所需范围内均匀分布任何整数.
  2. 您希望尽量减少簿记费用.这意味着,例如,如果您以1字节为单位进行缓存,则不希望存储4个字节的数据,只是为了跟踪1个字节所属的位置.
    • 你是怎样做的?您存储大于1个字节的块.

假设您选择16字节(2 4字节)块.这意味着你可以缓存2 20 /2 4 = 2 16数据= 65536块.

您现在有几个选择:

  • 您可以设计缓存,以便来自任何内存块的数据可以存储在任何缓存块中.这将被称为完全关联缓存.
  • 好处是它是"最公平"的缓存:所有块都被完全平等对待.
  • 权衡是速度:要找到放置内存块的位置,您必须在每个缓存块中搜索可用空间.这真的很慢.
  • 您可以设计缓存,以便来自任何内存块的数据只能存储在单个缓存块中.这将被称为直接映射缓存.
  • 好处是它是最快的缓存类型:您只需检查项目是否在缓存中.
  • 权衡的是,现在,如果你碰巧有一个糟糕的内存访问模式,你可以有2个块连续相互踢,未使用的块仍然在缓存中.
  • 您可以将两者混合使用:将单个内存块映射到多个块.这就是真正的处理器所做的事情 - 它们具有N路组关联缓存.

直接映射缓存:

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

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

答:嗯,你正在使用直接映射缓存,使用mod.这意味着地址0到15将被映射到缓存中的块0; 16-31被映射到块2等...当它到达1-MiB标记时它会环绕.

那么,给定内存地址M,你如何找到行号N?易:N = M%2 20 /2 4.
但这只会告诉您存储数据的位置,而不是如何检索数据.一旦你存储它,并尝试再次访问它,你必须知道这里存储了哪个 1 MB的内存,对吧?

这是一个元数据:标记位.如果它在行N中,那么你需要知道的是在mod操作期间是什么.对于32位地址,其中12位大(因为余数是20位).

所以你的标签变成12位长 - 特别是任何存储器地址的最高 12位.
并且您已经知道最低的4位用于块的偏移(因为存储器是字节寻址的,而块是16字节).
这使得16位的内存地址的"指数"位,可用于查找地址所属的排.(它只是一个除法+余数运算,但是二进制.)

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

还有其他你要学习的东西,用于优化,同步等......但这些是基本的.:)

  • @Mehrad 顺便说一句,这就是 stackoverlfow 的魔力!即使五年后,您的回答仍然非常有帮助。 (2认同)

GSi*_*lva 5

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

我希望这有帮助!如果您需要更多信息或者这仍然模糊,请告诉我,我知道有几个很好的网站可以很好地教授这个.

  • @hektor查看这个[链接](http://www.cs.iastate.edu/~prabhu/Tutorial/CACHE/bl_ident.html),这对于记忆和不同的替换技术以及对我最有帮助的技术非常有用.它甚至还有交互式java模块. (3认同)