缓存映射技术

时间:2018-12-05 04:33:20

标签: c++ caching memory

我正在尝试了解硬件缓存。我有一个主意,但是我想问一下我的理解是否正确。

所以我了解缓存映射有3种类型:直接,完全关联和集合关联。

我想知道用硬件中的逻辑门实现的映射类型,是特定于某些计算机系统的,为了更改映射,需要更改电气连接吗?

我目前的理解是在RAM中,存在一个内存地址来引用每个内存块。在一个块内包含单词,每个单词包含多个字节。我们可以用位数表示期权的数量。 因此,例如4096个存储位置,每个存储位置包含16个字节。如果我们要引用每个字节,则2 ^ 12 * 2 ^ 4 = 2 ^ 16 需要16位内存地址来引用每个字节。

高速缓存还具有一个内存地址,有效位,标签和一些数据,这些数据能够存储n个字(即m个字节)的主存储器块。其中m = n * i(每个字的字节数)

例如,直接映射 1个主存储器块只能位于高速缓存中的一个特定存储器位置。当CPU使用16位RAM内存请求某些数据时,它将首先检查高速缓存。 它怎么知道这个特定的16位内存地址只能在几个地方?

我的想法是,每个RAM地址与缓存地址之间可能存在某种电气连接。然后可以将16位地址拆分为多个部分,例如仅将剩余的8位与每个高速缓存存储器地址进行比较,如果匹配则比较字节位,然后是标记位,然后是有效位

我的理解正确吗?谢谢! 如果有人阅读了这篇长文章,我真的很感激

2 个答案:

答案 0 :(得分:1)

很少有映射功能用于具有主存储器的地图缓存行

  • 直接映射
  • 关联映射
  • 集合关联映射

您必须对这三个映射功能有个大概的认识

答案 1 :(得分:0)

您可能想阅读Ulrich Drepper的每个程序员应该了解的内存中的3.3.1 Associativityhttps://people.freebsd.org/~lstewart/articles/cpumemory.pdf#subsubsection.3.3.1

标题有点吸引人,但它详细说明了您要问的所有内容。

简而言之: caches的问题是比较数。如果您的cache拥有100个块,则需要在一个周期内执行100个比较。您可以通过引入sets来减少此数字。如果特定的内存区域只能放在插槽1-10中,则将比较次数减少到10。 sets由内存地址中称为索引的附加位字段寻址。 因此,例如,您的16位(来自您的示例)可以分为:

[15:6] block-address; stored in the `cache` as the `tag` to identify the block
[5:4] index-bits; 2Bit-->4 sets
[3:0] block-offset; byte position inside the block

因此,方法的选择取决于硬件资源的可用性和要归档的访问时间。它几乎是固定的,因为您想减少比较逻辑。