文章目录
- [1. 直接映射](#1. 直接映射)
- [2. 全相联映射](#2. 全相联映射)
- [3. 组相联映射](#3. 组相联映射)
不同的映射方式决定了CPU访问内存时,如何查找数据,以及Cache的利用率和命中率。在计算机体系结构中,Cache的映射方式主要有三种经典情况。
1. 直接映射
这是最简单、最直接的映射方式。
原理
主存被划分为许多页(Page),Cache也被划分为同样大小的行(Line)。
主存中的每一块只能固定映射到Cache中的唯一特定行。
映射关系通常由地址计算得出:Cache行号 = 主存块地址 % Cache总行数。
地址结构
CPU地址被划分为三部分:标记(Tag) + 行号(Line Index) + 块内偏移(Offset)。
特点
优点:硬件实现非常简单(比较器少,控制部分逻辑简单),查找速度快。
缺点:冲突率极高。如果程序反复访问两个映射到同一Cache行的不同主存块,就会导致频繁的Cache缺失和替换(即使别的Cache行是空的,也不能用),这种情况称为"抖动"。
类比
就像图书馆里每本书只有一个固定的书架位置(按书名的字母顺序固定摆放)。如果连续借两本都需要放在同一个格子的书,管理员就得来回替换。
2. 全相联映射
这是最灵活、最聪明的映射方式,但硬件代价最大。
原理
主存中的任何一个块,可以映射到Cache中的任何一个行位置。
当需要加载数据时,只要Cache中有空位,就可以放;当需要替换时,可以从所有Cache行中选择一个进行替换。
地址结构
地址被划分为两部分:标记(Tag) + 块内偏移(Offset)。这里没有了"行号"字段,因为数据可以放在任何地方。
特点
优点:空间利用率最高,冲突率最低。只有当Cache完全满时才会发生替换。
缺点:硬件实现极其复杂。每次查找数据时,控制部分需要将地址中的Tag与Cache中所有行的Tag同时进行比较(并行比较),这需要大量的比较器电路,成本高,功耗大,速度也会因此受影响(不适合做大容量的Cache)。
类比
图书馆里没有固定的书架,新书来了可以随便找个空位放。但要找书时,管理员必须翻遍整个图书馆的每一个角落才能找到。
3. 组相联映射
这是前两种方式的折中方案,也是现代CPU(如Intel/AMD)实际采用的主流方式。
原理
将Cache分为若干组(Set),每组包含多个行(称为路,Way)。
主存中的一个块可以映射到某一个特定组中的任意一行(但不能跨组)。
映射关系:Cache组号 = 主存块地址 % 组数。这其实是"直接映射"确定组,然后在组内采用"全相联"放置。
地址结构
地址被划分为三部分:标记(Tag) + 组号(Set Index) + 块内偏移(Offset)。
常用术语
常用术语:通常称为 n路组相联(n-Way Set Associative)。
例如:
2路组相联:每组有2个Cache行。
8路组相联:每组有8个Cache行。
特点
优点:兼具直接映射的快速定位(通过组号直接找到组)和全相联的灵活性(组内任意放)。冲突率比直接映射低,硬件复杂度比全相联低。
缺点:比直接映射复杂一些,且组数决定了冲突的上限。
类比
图书馆分成多个区域(组),每本书按类别只能去某个固定区域,但在该区域内,可以随便放在任何一个书架上。