Caching 直接映射缓存是如何工作的?

Caching 直接映射缓存是如何工作的?,caching,system,cpu-architecture,Caching,System,Cpu Architecture,我正在学习系统架构课程,我很难理解直接映射缓存是如何工作的 我看了好几个地方,他们用不同的方式解释,这让我更加困惑 我无法理解的是什么是标记和索引,以及它们是如何选择的 我演讲的解释是: “地址分为两部分 用于直接寻址(32k)RAM的索引(例如15位) 地址的其余部分,将存储标记并与传入标记进行比较。” 那标签是从哪里来的?它不能是RAM中内存位置的完整地址,因为它使直接映射缓存无效(与完全关联缓存相比) 非常感谢。让我们举个例子。具有16字节缓存线的64 KB缓存具有4096条不同的缓存线

我正在学习系统架构课程,我很难理解直接映射缓存是如何工作的

我看了好几个地方,他们用不同的方式解释,这让我更加困惑

我无法理解的是什么是标记和索引,以及它们是如何选择的

我演讲的解释是: “地址分为两部分 用于直接寻址(32k)RAM的索引(例如15位) 地址的其余部分,将存储标记并与传入标记进行比较。”

那标签是从哪里来的?它不能是RAM中内存位置的完整地址,因为它使直接映射缓存无效(与完全关联缓存相比)


非常感谢。

让我们举个例子。具有16字节缓存线的64 KB缓存具有4096条不同的缓存线

你需要把地址分成三个不同的部分

  • 最低位用于告诉您当您取回缓存线中的字节时,该部分不会直接用于缓存查找。(本例中的位0-3)
  • 下一位用于索引缓存。如果将缓存视为缓存线的一大列,则索引位会告诉您需要查找数据的行。(本例中的第4-15位)
  • 所有其他位都是标记位。这些位存储在标记存储中,用于缓存中存储的数据,我们将缓存请求的相应位与我们存储的数据进行比较,以确定我们正在缓存的数据是否是被请求的数据

  • 用于索引的位数是log_base_2(缓存线的数量)[实际上是集合的数量,但在直接映射缓存中,有相同数量的行和集合]

    直接映射缓存就像一个表,其中有行也称为缓存线,至少有两列,一列用于数据,另一列用于标记

    下面是它的工作原理:对缓存的读访问获取地址的中间部分,称为索引,并将其用作行号。同时查找数据和标记。 接下来,需要将标记与地址的上半部分进行比较,以确定该行是否来自内存中的相同地址范围,并且是否有效。同时,地址的下半部分可用于从缓存线选择请求的数据(我假设缓存线可以保存几个字的数据)

    我强调了数据访问和标记访问+比较是同时发生的,因为这是减少延迟的关键(缓存的目的)。数据路径ram访问不需要两个步骤

    优点是读取基本上是一个简单的表查找和比较


    但它是直接映射的,这意味着对于每个读取地址,缓存中只有一个位置可以缓存这些数据。所以缺点是很多其他地址会被映射到同一个地方,可能会竞争这个缓存线。

    我在图书馆找到了一本好书,它为我提供了我需要的清晰解释,现在我将在这里分享,以防其他学生在搜索缓存时偶然发现这个线程

    这本书是亨尼西和帕特森的《计算机体系结构——定量方法》第三版,第390页

    首先,请记住,主内存被划分为用于缓存的块。 如果我们有一个64字节的缓存和1GB的RAM,RAM将被分成128KB的块(1GB的RAM/64B的缓存=128KB的块大小)

    书中:

    块可以放在缓存中的什么位置?

    • 如果每个块只有一个可以出现在缓存中的位置,则称缓存为直接映射。使用以下公式计算目标块:
      MOD
    假设我们有32块RAM和8块缓存

    如果我们想将块12从RAM存储到缓存中,RAM块12将存储到缓存块4中。为什么?因为12/8=1,剩余4。其余部分是目标块

    • 如果块可以放置在缓存中的任何位置,则称缓存为完全关联

    • 如果块可以放置在缓存中受限位置集中的任何位置,则缓存将设置为关联

    基本上,集合是缓存中的一组块。块首先映射到集合上,然后可以将块放置在集合内的任何位置

    公式为:
    MOD

    因此,假设我们有32个RAM块和一个分为4组的缓存(每组有两个块,即总共8个块)。这样,集合0将具有块0和块1,集合1将具有块2和块3,依此类推

    如果我们想将RAM块12存储到缓存中,则RAM块将存储在缓存块0或1中。为什么?因为12/4=3,余数为0。因此,选择集合0,块可以放置在集合0内的任何位置(表示块0和块1)

    现在我将回到我最初的地址问题

    如果块在缓存中,如何找到它?

    缓存中的每个块帧都有一个地址。为了清楚起见,一个块既有地址也有数据

    块地址分为多个部分:标记、索引和偏移

    标记用于查找缓存中的块,索引仅显示块所在的集合(使其非常冗余),偏移量用于选择数据

    通过“选择数据”,我的意思是,在缓存块中,显然会有多个内存位置,偏移量用于在它们之间进行选择

    因此,如果您想想象一个表,这些列将是:

    TAG | INDEX | OFFSET | DATA 1 | DATA 2 | ... | DATA N
    
    标记将用于查找块,索引将显示块所在的集合,偏移量将选择其右侧的一个字段

    我希望我对这一点的理解是正确的,如果不是,请让我