您所指的缓存称为集合关联缓存。整个缓存分为多个集合,每个集合包含 4 个缓存行(因此是 4 路缓存)。所以关系是这样的:
缓存大小 = 缓存中的集合数 * 每个集合中的缓存行数 * 缓存行大小
您的缓存大小是 32KB,它是 4 路,缓存行大小是 32B。所以集合的数量是
(32KB / (4 * 32B)) = 256
如果我们认为主内存是由缓存线组成的,那么每个缓存线大小的内存区域称为一个块。所以每个主存块都会被映射到一个缓存行(但并不总是映射到一个特定的缓存行,因为它被设置为关联缓存)。
在集合关联缓存中,每个内存块都会映射到缓存中的一个固定集合。但它可以存储在集合的任何缓存行中。在您的示例中,每个内存块都可以存储在一组的 4 个缓存行中的任何一个中。
内存块到缓存行的映射
主存中的块数 = (1GB / 32B) = 2^25
每页的块数 = (4KB / 32B) = 128
系统中的每个字节地址可分为3部分:
- 最右边的位表示缓存行或块中的字节偏移量
- 中间位表示此字节(或缓存行)将映射到哪个缓存集
- 最左边的位代表标签值
表示 1GB 内存所需的位数 = 30 (1GB = (2^30)B)
表示缓存行偏移所需的位 = 5 (32B = (2^5)B)
表示 256 个缓存集所需的位 = 8 (2^8 = 256)
这样我们就剩下 (30 - 5 - 8) = 17 位用于标记。由于不同的内存块可以映射到同一个缓存行,这个标签值有助于区分它们。
处理器生成地址时,30位地址的中间8位用于选择缓存集。该集合中将有 4 个缓存行。因此,所有四个常驻缓存行的标签都会与生成地址的标签进行匹配。
示例
如果一个 30 位的地址是 00000000000000000-00000100-00010(为清楚起见,用“-”分隔),那么
- 缓存内的偏移量为 2
- 集数为4
- 标签为0