同时和分层缓存访问
先决条件:缓存组织
介绍 :
在本文中,我们将尝试详细了解同时缓存访问和分层缓存访问,并了解当 CPU(中央处理单元)请求当前存储在缓存中的主内存块时,这些访问实际上是如何工作的。
在直接进入缓存访问的类型之前,让我们首先简要了解缓存内存,例如缓存内存到底是什么以及为什么需要使用缓存内存。
高速缓存的工作:
以下关键点(从上面的图形表示中说明)将简要介绍缓存内存,它的重要性以及如何有效地使用它 -
- 如果 CPU 生成一个地址(它本身就是一个主存地址)并希望对该特定内容上的内容执行某种操作,那么直接访问主存将是一个耗时的过程。
- 耗时的原因是 CPU 将首先检查其在主存中生成的地址,让我们假设如果 CPU 在主存中找到该特定地址,然后 CPU 将对该操作数执行其操作(值为存在于特定的主存储器地址中)。
- 整个过程将花费大量时间,最终会使 CPU 变慢,并且还会导致程序损坏或破坏非常严重。
- 这就是为什么我们需要高速缓存,以便在访问 CPU 最终从高速缓存接收到的任何类型的信息时使 CPU 工作得更快一些,我们在其中保留 CPU 访问所需的最需要或最需要的数据。
- 在高速缓存中,我们将保留 CPU 所需的所有块,因此我们将减少从主内存访问特定内容的内存访问时间,因为现在我们通过高速缓存访问它。
- 如果 CPU 试图访问在高速缓存内存中找不到的主内存块,那么 CPU 将不得不访问主内存本身以在特定的主内存块上执行进一步的操作。
现在您已经了解了高速缓存内存的基本概念以及当 CPU 想要访问任何主内存地址时它是如何工作的,让我们进入我们的主要考虑主题,即同时高速缓存访问和分层高速缓存访问。
高速缓存访问的类型:当 CPU 希望访问特定的主存储器地址时,可能有两种类型的高速缓存访问:同时高速缓存访问和分层高速缓存访问。它们都具有类似的块表示,但它们的工作、访问以及最重要的是它们的平均内存访问时间分别不同。
1.同时缓存访问:
- 在同时高速缓存访问中,同时产生对高速缓存存储器和主存储器的请求。
- 如果在高速缓存内存中找到 CPU 生成的地址,则将其视为命中,然后 CPU 可以直接访问主内存地址以及高速缓存内存本身的内容,如果高速缓存内存中发生任何类型的更改,则进一步那么在高速缓存内存之后,也会在主内存中进行更改。
- 如果在高速缓存内存中找不到 CPU 生成地址,则将其视为未命中,然后 CPU 必须从主内存访问该地址,并且更多来自主内存的块被移动到高速缓存内存以供将来参考和使用。
- 同步内存访问用于实现高速缓存写入。
计算同时访问中的平均内存访问时间 –
如果命中,则 CPU 将访问高速缓存本身的内容,如果未命中,则主存储器将起作用。
因此,在同时访问的情况下,平均内存访问时间将如下所示 -
- 平均内存访问时间 = 命中率 * 高速缓存内存访问时间 + (1 – 命中率) * 主内存访问时间
如果假设此处包含引用的局部性,那么我们使用以下概念来确定平均内存访问时间 -
- 平均内存访问时间 = 命中率 * 高速缓存内存访问时间 + (1 – 命中率) * 访问一块主内存所需的时间。
其中,访问主存块所需的时间 = 块大小 * 访问主存所需的时间。
如果假设这里还包括块传输时间,那么我们使用以下概念来确定平均内存访问时间 -
- 平均内存访问时间 = 命中率 * 缓存内存访问时间 + (1 – 命中率) * (缓存内存访问时间 + 访问一块主内存所需的时间)
其中,访问主存块所需的时间 = 块大小 * 访问主存所需的时间
这里使用高速缓存访问以防丢失以及块访问时间的原因是我们需要将块复制到高速缓存中(如果在任何特定场景中说明)。
2.分层缓存访问:
尽管基本块结构与分层缓存访问的基本块结构相似,但实际上分层和同时缓存内存访问之间存在一些差异,如下所述(分)-
- 在分层缓存访问中,仅首先访问较快的内存(即高速缓存内存)。
- 之后如果 CPU 生成的地址在 Cache 内存中没有找到,那么随着在 Cache 内存中的搜索时间,主内存访问时间也将被计算在内。
- 默认情况下,许多计算机设计仅使用这种分层访问,因为这种缓存访问由于引用概念的局部性而减少了平均内存访问时间(其中对于主内存的特定地址,我们只需将其前一个地址和下一个地址也以块,以便将来需要更少的内存访问)。
分层访问中平均内存访问时间的计算 –
如果命中,则 CPU 将访问高速缓存本身的内容,如果未命中,则与高速缓存访问时间一起计算主内存访问时间。
因此,分层访问情况下的平均内存访问时间将如下所示 -
- 平均内存访问时间 = 命中率 * 缓存内存访问时间 + (1 – 命中率) * (缓存内存访问时间 + 主内存访问时间)
示例 1:在 2 级层次结构中,如果顶层的访问时间为 10ns,底层的访问时间为 60ns,那么平均访问时间为 15ns,顶层的命中率是多少?
解释:根据例子,我们给定了缓存访问时间(顶层)= 10ns,主内存访问时间(底层)= 60ns,平均内存访问时间= 15ns。
因此,我们将应用上述分层访问的概念(因为它被写成 2 级层次结构)来计算内存访问时间——
平均内存访问时间 = Hit ratio * Cache memory access time + (1 – Hit ratio) * (Cache Memory access time + Main memory access time)
15ns = 10 * 命中率 + (1 – 命中率) * (10ns + 60ns)
15ns-70ns = -60 * 命中率
命中率 = 55 /60 = 11/12 = 0.9 (Ans.)
如果假设此处包含引用的局部性,那么我们使用以下概念来确定平均内存访问时间。
- 平均内存访问时间 = 命中率 * 缓存内存访问时间 + (1 – 命中率) * (访问一块主内存所需的时间 + 缓存内存访问时间)
其中,访问主存块所需的时间 = 块大小 * 访问主存所需的时间
示例 2——
在两级层次结构中,顶层的访问时间为10ns,底层的访问时间为50ns,顶层的命中率为90%。如果缓存的块大小是 16 字节,那么平均需要多少内存访问时间? (考虑系统使用参考位置)
解释 -
给定高速缓存访问时间(顶级)= 10ns
主存访问时间(底层)= 60ns
因此,当我们必须考虑参考概念的局部性时,我们将应用上述学习的概念来计算平均内存访问时间。
- 平均内存访问时间 = Hit ratio * Cache memory access time + (1 – Hit ratio) * ((Block size * main memory access time) + cache memory access time)
平均内存访问时间 = 10 * 0.9 + (1 – 0.9) * (16 * 5 + 10)
= 9 + (0.1) * (800 + 10)
= 9 + 81 = 90ns (Ans.)
如果假设这里还包括块传输时间,那么我们使用以下概念来确定平均内存访问时间。
平均内存访问时间=命中率*高速缓存访问时间+(1-命中率)*(高速缓存访问时间+访问一块主内存所需的时间+高速缓存访问时间)
其中,访问主存块所需的时间 = 块大小 * 访问主存所需的时间
示例 3 –
在两级层次结构中,缓存的访问时间为12ns,主存的访问时间为120ns,缓存的命中率为90%。如果缓存的块大小是 16 字节,那么包括 Miss Penalty 在内的平均内存访问时间是多少? (Miss Penalty:发生缓存未命中时将主内存块带到缓存内存的时间)
解释 -
给定缓存内存访问时间= 12ns
主存访问时间= 120ns
因此,我们将使用上面学到的概念来计算在缓存未命中时从主内存到缓存内存的块传输时的平均内存访问时间。
- 平均内存访问时间 = Hit ratio * Cache memory access time + (1 – Hit ratio) * (Cache memory access time + (Block size * Main memory access time)+ Cache memory access time due to block transfer)
平均内存访问时间 = 0.9 * 12 = (0.1) * (12ns + 16 * 120 ns + 12ns)
= 10.8ns + 194.4ns = 205.2ns (Ans.)