将 Cache 分为 Q 个大小相等的组,每组有 r 个 Cache行,称为 r 路组相联。
Cache 组号 = 主存块号 mod Cache 组数 (Q)【假设】
- 某计算机的主存地址空间为 256MB,按字节编址(1B),则有 256MB/1B = 256M = 228 个存储单元,地址位数为 28
- 一个主存块大小为 64B(即 Cache 行长为 64B),则一个主存块的存储单元个数为 64B/1B = 64
- Cache 有 16 行,又已知 Cache 行长为 64B,二路组相联,一共 16/2=8 组
【解答】
Cache 一共 23 = 8 组,所以组号占 3 位;主存块(行长)存储单元个数为 26 = 64,所以块内地址占 6 位;因此标记占 28-3-6=19 位。
| 标记 | 组号 | 块内地址 |
|---|---|---|
| 19b | 3b | 6b |
| (组号) | (行号) | 有效位 | 标记位(Tag) | 数据(行长) |
|---|---|---|---|---|
| (0) | (0) | 1b | 19b | 64B |
| (0) | (1) | 1b | 19b | 64B |
| (1) | (2) | 1b | 19b | 64B |
| (1) | (3) | 1b | 19b | 64B |
| (…) | (…) | … | … | … |
| (…) | (…) | … | … | … |
| (7) | (14) | 1b | 19b | 64B |
| (7) | (15) | 1b | 19b | 64B |
【注】有些题目中, Cache 的容量大小指的是 Cache 存储容量,不包括标记阵列(标记位、有效位、脏位等)。比如某个 Cache 容量大小为 64KB,指的是 Cache 存储容量为 64KB,若再加条件:Cache 行长(即主存块大小)为 128B,则该 Cache 总行数为 64KB/128B = 512 行。
【假设】
- 某计算机的主存地址空间为 256MB,按字编址(4B),则有 256MB/4B = 64M = 226 个存储单元,地址位数为 26
- 一个主存块大小为 64B(即 Cache 行长为 64B),则一个主存块的存储单元个数为 64B/4B = 16
- Cache 有 16 行,又已知 Cache 行长为 64B,二路组相联,一共 16/2=8 组
【解答】
Cache 一共 23 = 8 组,所以组号占 3 位;主存块(行长)存储单元个数为 24 = 16,所以块内地址占 4 位;因此标记占 26-3-4=19 位。
| 标记 | 组号 | 块内地址 |
|---|---|---|
| 19b | 3b | 4b |
| (组号) | (行号) | 有效位 | 标记位(Tag) | 数据(行长) |
|---|---|---|---|---|
| (0) | (0) | 1b | 19b | 64B |
| (0) | (1) | 1b | 19b | 64B |
| (1) | (2) | 1b | 19b | 64B |
| (1) | (3) | 1b | 19b | 64B |
| (…) | (…) | … | … | … |
| (…) | (…) | … | … | … |
| (7) | (14) | 1b | 19b | 64B |
| (7) | (15) | 1b | 19b | 64B |
【假设】
- 某计算机的主存地址空间为 256MB,按字节编址(1B),则有 256MB/1B = 256M = 228 个存储单元,地址位数为 28
- 一个主存块大小为 16B(即 Cache 行长为 16B),则一个主存块的存储单元个数为 16B/1B = 16
- Cache 有 64 行,又已知 Cache 行长为 16B,四路组相联,一共 64/4=16 组
- 考虑 LRU 算法、回写策略
【解答】
Cache 一共 24 = 16 组,所以组号占 4 位;主存块(行长)存储单元个数为 24 = 16,所以块内地址占 4 位;因此标记占 28-4-4=20 位。
| 标记 | 组号 | 块内地址 |
|---|---|---|
| 20b | 4b | 4b |
考虑 LRU 算法,因为是四路组相联,2^2=4,所以替换控制位占 2 位;考虑回写策略,所以脏位占 1 位。(注意:如果题目中没有要求考虑,则不需要加这些东西)
| (组号) | (行号) | 有效位 | 替换控制位 | 脏位 | 标记位(Tag) | 数据(行长) |
|---|---|---|---|---|---|---|
| (0) | (0) | 1b | 2b | 1b | 20b | 16B |
| (0) | (1) | 1b | 2b | 1b | 20b | 16B |
| (0) | (2) | 1b | 2b | 1b | 20b | 16B |
| (0) | (3) | 1b | 2b | 1b | 20b | 16B |
| (1) | (4) | 1b | 2b | 1b | 20b | 16B |
| (1) | (5) | 1b | 2b | 1b | 20b | 16B |
| (1) | (6) | 1b | 2b | 1b | 20b | 16B |
| (1) | (7) | 1b | 2b | 1b | 20b | 16B |
| (…) | (…) | … | … | … | ||
| (…) | (…) | … | … | … | ||
| (15) | (62) | 1b | 2b | 1b | 20b | 16B |
| (15) | (63) | 1b | 2b | 1b | 20b | 16B |
当 Q=1 时变为全相联映射,即整个 Cache 都是一个组。
【假设】
- 某计算机的主存地址空间为 256MB,按字节编址(1B),则有 256MB/1B = 256M = 228 个存储单元,地址位数为 28
- 一个主存块大小为 64B(即 Cache 行长为 64B),则一个主存块的存储单元个数为 64B/1B = 64
- Cache 有 16 行,又已知 Cache 行长为 64B
【解答】
主存块(行长)存储单元个数为 26 = 64,所以块内地址占 6 位;因此标记占 28-6=22 位。
| 标记 | 组号 | 块内地址 |
|---|---|---|
| 22b | 0b | 6b |
| (组号) | (行号) | 有效位 | 标记位(Tag) | 数据(行长) |
|---|---|---|---|---|
| (0) | (0) | 1b | 22b | 64B |
| (0) | (1) | 1b | 22b | 64B |
| (0) | (2) | 1b | 22b | 64B |
| (0) | (3) | 1b | 22b | 64B |
| (…) | (…) | … | … | … |
| (…) | (…) | … | … | … |
| (0) | (14) | 1b | 22b | 64B |
| (0) | (15) | 1b | 22b | 64B |
【假设】
- 某计算机的主存地址空间为 256MB,按字编址(4B),则有 256MB/4B = 64M = 226 个存储单元,地址位数为 26
- 一个主存块大小为 64B(即 Cache 行长为 64B),则一个主存块的存储单元个数为 64B/4B = 16
- Cache 有 16 行,又已知 Cache 行长为 64B
【解答】
主存块(行长)存储单元个数为 24 = 16,所以块内地址占 4 位;因此标记占 28-4=24 位。
| 标记 | 组号 | 块内地址 |
|---|---|---|
| 24b | 0b | 4b |
| (组号) | (行号) | 有效位 | 标记位(Tag) | 数据(行长) |
|---|---|---|---|---|
| (0) | (0) | 1b | 24b | 64B |
| (0) | (1) | 1b | 24b | 64B |
| (0) | (2) | 1b | 24b | 64B |
| (0) | (3) | 1b | 24b | 64B |
| (…) | (…) | … | … | … |
| (…) | (…) | … | … | … |
| (0) | (14) | 1b | 24b | 64B |
| (0) | (15) | 1b | 24b | 64B |
当 r=1 时变为直接映射,即每行 Cache 都是一个组。
Cache 组号 = 主存块号 mod Cache 总行数【假设】
- 某计算机的主存地址空间为 256MB,按字节编址(1B),则有 256MB/1B = 256M = 228 个存储单元,地址位数为 28
- 一个主存块大小为 64B(即 Cache 行长为 64B),则一个主存块的存储单元个数为 64B/1B = 64
- Cache 有 16 行,又已知 Cache 行长为 64B
【解答】
Cache 一共 24 = 16 行,所以行号占 4 位;主存块(行长)存储单元个数为 26 = 64,所以块内地址占 6 位;因此标记占 28-4-6=18 位。
| 标记 | 行号(组号) | 块内地址 |
|---|---|---|
| 18b | 4b | 6b |
| (组号) | (行号) | 有效位 | 标记位(Tag) | 数据(行长) |
|---|---|---|---|---|
| (0) | (0) | 1b | 18b | 64B |
| (1) | (1) | 1b | 18b | 64B |
| (2) | (2) | 1b | 18b | 64B |
| (3) | (3) | 1b | 18b | 64B |
| (…) | (…) | … | … | … |
| (…) | (…) | … | … | … |
| (14) | (14) | 1b | 18b | 64B |
| (15) | (15) | 1b | 18b | 64B |
假设虚拟地址空间为 32 位,一页为 4KB,物理地址空间为 28 位,则:
| 虚页号 | 页内地址 |
|---|---|
| 20b | 12b |
| (虚页号) | 有效位 | 物理页号(页框号) |
|---|---|---|
| (0) | 1b | 16b |
| (1) | 1b | 16b |
| (2) | 1b | 16b |
| (3) | 1b | 16b |
| 物理页号 | 页内地址 |
|---|---|
| 16b | 12b |
【假设】
- 主存空间大小为 256MB,按字节编址,则物理地址位数为 28 位
- 虚拟地址空间大小为 4GB,页面大小为 4KB,则地址位数为 32 位,有 4GB/4KB = 220 页,所以虚拟地址的虚页号占高 20 位,虚拟地址的页内地址占低 12 位;物理地址的页内地址也占低 12 位,因而物理地址的页号占高 16 位
- TLB 为二路组相联,一共四组,22=4,则虚页号中组号还要占低 2 位
【则有】
| 虚页号(标记) | 组号 | 页内地址 |
|---|---|---|
| 18b | 2b | 12b |
| (组号) | (行号) | 有效位 | 标记(Tag) | 物理页号(页框号) |
|---|---|---|---|---|
| (0) | (0) | 1b | 18b | 16b |
| (0) | (1) | 1b | 18b | 16b |
| (1) | (2) | 1b | 18b | 16b |
| (1) | (3) | 1b | 18b | 16b |
| (2) | (4) | 1b | 18b | 16b |
| (2) | (5) | 1b | 18b | 16b |
| (3) | (6) | 1b | 18b | 16b |
| (3) | (7) | 1b | 18b | 16b |
| 物理页号 | 页内地址 |
|---|---|
| 16b | 12b |
【假设】
- 主存空间大小为 256MB,按字节编址,则物理地址位数为 28 位
- 虚拟地址空间大小为 4GB,页面大小为 4KB,则地址位数为 32 位,有 4GB/4KB = 220 页,所以虚拟地址的虚页号占高 20 位,虚拟地址的页内地址占低 12 位;物理地址的页内地址也占低 12 位,因而物理地址的页号占高 16 位
- TLB 为全相联,共 8 行
【则有】
| 虚页号(标记) | 组号 | 页内地址 |
|---|---|---|
| 20b | 0b | 12b |
| (组号) | (行号) | 有效位 | 标记(Tag) | 物理页号(页框号) |
|---|---|---|---|---|
| (0) | (0) | 1b | 20b | 16b |
| (0) | (1) | 1b | 20b | 16b |
| (0) | (2) | 1b | 20b | 16b |
| (0) | (3) | 1b | 20b | 16b |
| (0) | (4) | 1b | 20b | 16b |
| (0) | (5) | 1b | 20b | 16b |
| (0) | (6) | 1b | 20b | 16b |
| (0) | (7) | 1b | 20b | 16b |
| 物理页号 | 页内地址 |
|---|---|
| 16b | 12b |
【假设】
- 主存空间大小为 256MB,按字节编址,则物理地址位数为 28 位
- 虚拟地址空间大小为 4GB,页面大小为 4KB,则地址位数为 32 位,有 4GB/4KB = 220 页,所以虚拟地址的虚页号占高 20 位,虚拟地址的页内地址占低 12 位;物理地址的页内地址也占低 12 位,因而物理地址的页号占高 16 位
- TLB 为直接相联,共 8 行,23=8,所以虚页号中行号还要占低 3 位
【则有】
| 虚页号(标记) | 行号 | 页内地址 |
|---|---|---|
| 17b | 3b | 12b |
| (组号) | (行号) | 有效位 | 标记(Tag) | 物理页号(页框号) |
|---|---|---|---|---|
| (0) | (0) | 1b | 17b | 16b |
| (1) | (1) | 1b | 17b | 16b |
| (2) | (2) | 1b | 17b | 16b |
| (3) | (3) | 1b | 17b | 16b |
| (4) | (4) | 1b | 17b | 16b |
| (5) | (5) | 1b | 17b | 16b |
| (6) | (6) | 1b | 17b | 16b |
| (7) | (7) | 1b | 17b | 16b |
| 物理页号 | 页内地址 |
|---|---|
| 16b | 12b |
计数器变化规则:
【假设】内存容量为 4 个页面,使用 LRU 页面替换算法,考虑以下页面访问顺序:{1, 8, 1, 7, 2, 7, 2, 1, 8, 3, 8, 3, 2, 7}
【解答】(斜体表示命中,加粗表示替换)
无空闲行且需要替换时,从上一次替换的位置开始,从左往右找每一行的最后一个命中,最后一个命中出现最早(或没有出现命中)的那一行说明访问频率较少(或没有访问),替换那一行。
| 顺序 | 1 | 8 | 1 | 7 | 2 | 7 | 2 | 1 | 8 | 3 | 8 | 3 | 2 | 7 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 页#0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 7 |
| 页#1 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | |
| 页#2 | 7 | 7 | 7 | 7 | 7 | 7 | 3 | 3 | 3 | 3 | 3 | |||
| 页#3 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
综上,失效次数(未命中次数)为 6 次,命中率为 8/14。
先计算 Cache 组号 = 主存块号 mod Cache 组数 (Q),看对应的 Cache 组里面有无命中的行,然后按照以下计数器变化规则处理(注意只处理对应组里面的所有行,其他组不用管):
【假设】Cache 采用二路组相联方式,访问主存地址顺序:{0, 4, 8, 2, 0, 6, 8, 6, 4, 8}
【解答】(斜体表示命中或有空闲行插入,加粗表示替换)
无空闲行且需要替换时,从上一次替换的位置开始,从左往右找每一行的最后一个命中,最后一个命中出现最早(或没有出现命中)的那一行说明访问频率较少(或没有访问),替换那一行。注意该操作需要在对应组内进行。
【注意】
| 组号 | 顺序 | 0 | 4 | 8 | 2 | 0 | 6 | 8 | 6 | 4 | 8 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 行#0 | 0 | 4 | 4 | 8 | 8 | 0 | 0 | 8 | 8 | |
| 0 | 行#1 | 0 | 4 | 8 | 8 | 0 | 0 | 8 | 8 | 4 | 4 |
| 1 | 行#2 | 2 | 2 | 2 | 2 | 2 | |||||
| 1 | 行#3 | 2 | 2 | 6 | 6 | 6 | 6 | 6 |
命中次数为 3,命中率为 3/10。