Cache和主存的关系
Cache行中的信息是主存中某个块的副本,将内存以块为单位调入Cache供快速访问。内存的数据将被调入到Cache行的数据块中,Cache用于缓和主存和CPU之间的速度矛盾。
直接映射
主存中每一块在Cache中有唯一Cache行与之对应。若调入内存块时该Cache行已有内容将会产生冲突。直接映射方式发生冲突概率最高。直接映射的关系定义为Cache行号 = 主存块号 % Cache总行数
若Cache有
2
c
2^c
2c行,主存有
2
m
2^m
2m块,映射关系如图所示。其中Cache块号即为主存块号的末尾c位。
其中,每个Cache行都有其对应的标记项。标记项+数据块共同构成一个Cache行。标记项的长度t=m-c。主存地址的高t位即为主存的标记,将主存数据调入数据块后将地址高t位写入标记。标记还有一位有效位,根据不同的需求还可能会有修改位(Cache回写法标记Cache行是否被修改)、替换位(Cache中主存块替换算法使用)等。
在Cache行查数据时,先通过直接映射关系找到Cache行,若Cache行中标记项与查找主存地址高t位相等且有效位为1,则查询命中,用主存块号的末尾c位定位Cache行,在Cache行中查询数据。若标记项与查找主存地址高t位不相等或有效位为0,则未命中,前往主存。
若主存地址为32位,一个内存块占64B(行长=内存块大小=
2
6
2^6
26B),共有32个Cache行(
2
5
2^5
25),则主存地址结构如下所示。
标记(19位) | Cache行号(5位) | 块内地址(8位) |
---|
其中,高19+5=24位为主存块号,低5+8=13位为Cache地址。
【例题】 假设某个计算机的主存地址空间大小为256MB,按字节编址,其数据Cache有8个Cache行,行长为64B。若不考虑Cache的一致维护性和替换算法控制位,并且采用直接映射方式,则该数据Cache的总容量为多少?
【分析】计算机的主存地址空间大小为256MB= 2 28 2^{28} 228B,且该计算机系统按字节编址,则主存地址共有28位。数据Cache有 2 3 2^3 23个Cache行,故Cache行号占3位。行长=内存块大小= 2 6 2^6 26B,故块内地址占6位。主存地址结构如下所示。
标记(19位) | Cache行号(3位) | 块内地址(6位) |
---|
Cache的总容量由标记项、Cache数据块共同构成。对每个Cache行,标记项占19+1(有效位)= 20bit,数据块占64B=64*8=512bit。
则该数据Cache的总容量 = 8 *(20+512)bit = 4256bit
全相联映射
主存中的每一块都可以装入Cache中的任何位置,每行的标记用于指出该行取自主存的哪一块,与直接映射不同的是,全相联映射需要与所有Cache行比较直到找到标记项相等的Cache行。但Cache块冲突概率低,空间利用率高,命中率也高。但需要与所有Cache行标记进行比较,速度较慢。
大体与直接映射类似,唯一不同之处在于全相联映射中主存块与Cache行不存在直接映射关系,故如上图中的主存地址结构里低b位为字块内地址(Cache行内地址),高m位全为标记项。
组相联映射
组相联映射结合了直接映射与全相联映射的优点,将Cache分成Q个大小相等的组,组间采用直接映射方式,组内采用全相联映射方式。若其中每组有r个Cache行,则称之为r路组相联。常见地,当r=2时,称之为二路组相联。若Q=1,组相联映射变为全相联映射(只留下一个组);Q=总Cache行数时,变为直接映射(不进行划分)。
组相联映射的关系定义为Cache组号 = 主存块号 % Cache组数(Q)
其地址结构类似于直接映射的地址结构。
标记 | Cache组号 | 块内地址 |
---|
从地址角度来解释,Cache组号的意义与直接映射的Cache行号意义相同。但是一个主存块被映射到了一个Cache组而不是Cache行。一个Cache组内有r个Cache行,在写入Cache组时采用全相联映射方式大大降低了冲突概率。
按照我的个人解释,Cache组相联映射的查找原理类似于使用链地址法处理冲突的Hash查找表。首先利用Hash函数(组相联映射关系)定位查找元素位置(Cache组),遍历该位置的链上元素(该组Cache行的标记),若存在(且有效位为1)则查找成功,否则查找失败。不同之处在于组相联映射对同一种映射关系只能存在r个Cache行,第r+1个Cache行需要置换。
其中,由于组内是全相联存储器,不需要定位到它是组内第几行。
[Cache组号+块内地址]即为Cache地址。
Cache组号 | 块内地址 |
---|
n路组相联映射的标记阵列
对于n路组相联映射的标记项,将每组的标记项排成一行,各组从上到下排列(对直接映射和全相联映射是直接从上到下排列)。
下表为二路组相联的标记阵列,对n路组相联来说有n列标记项。
标记项 | 标记项 |
---|---|
标记项 | 标记项 |
标记项 | 标记项 |
标记项 | 标记项 |
标记项 | 标记项 |
其中每个标记项的内容都与直接映射中说明的标记项内容相同。