在计算机的主存(内存)和CPU之间,还有cache,常用数据先从内存复制到cache,以提高性能。
这样就有一个如何复制的问题,也就是数据从内存复制到cache后,存放在哪里的问题。二者有一个地址对应关系。
有3种对应模式:
1、直接相联
2、全相联
3、组相联
不管哪种对应模式,为了适应将数据复制到cache,内存区大小 == cache大小;内存的页(也称为块)大小,也会和cache的页(块)大小保持一致。即
内存区大小 == cache大小
内存页(块)大小 == cache页(块)大小
一定要牢牢记住这一点。这是cache每块编址的基础。
内存页与cache页的对应关系,通过一个标记对照表来记录和查找。
1、直接相联
内存根据cache的尺寸,先分区,然后每个区分页。每个区跟cache一样大;每个页跟cache的页一样大。
内存页号==cache页号
。主存分区,每个区尺寸==cache的尺寸
;然后每个区分页(块),内存页号==cache页号
。直接相联冲突机会最大。
cache标记位记录内存区号。页号不必记录,因为内存页号==cache页号。
标记 = 内存区号
2、全相联
内存不分区,只分页,每个页跟cache的页一样大。
内存块可以复制到cache任一块。冲突机会最小。
cache标记记录内存页号。
标记 = 内存页号
上图主存页(即块)与cache之间的黑线,代表比较。
3、组相联
内存根据cache的尺寸,先分区,然后每个区分页。每个区跟cache一样大;每个页跟cache的页一样大。
内存和cache各自分组,组之间直接相联,组号保持一致;而组内的块则全相联,自由搭配。冲突机会折中。
教程里说,组相联情况下,内存组内的页数 == cache组数,好像没道理,是不是说错了?应该是 内存组内的页数 = cache组内页数吧。
cache标记记录内存区号 + 块号。内存组号不必记录,因为内存组号 == cache组号。
标记 = 内存区号 + 内存页号
4、习题一
答:
1)
所谓Cache的地址变换表,就是Cache的标记表。已知组相联方式下,cache标记 = 内存区号 + 块(页)号
Cache大小 = 2 * 4 * 512 = 2 ^12,2的12次方
则有:
内存区数量 = (2^20) / (2 ^12) = 2 ^ 8
内存每组块数 == Cache每组块数 = 4 = 2^2
所以Cache每行标记为 8 + 2 = 10bit(组相联,标记 = 主存区号 + 主存页号)
由于Cache共有2 * 4 = 8块,因此标记表容量为 8 * 10bit
2)组相联的特点是组间直接相联,不需要比较;但组内块全相联,需要一一比较,因为每组有4块,所以每次都要比较4次,参与比较的存储单元有 4 个。所谓存储单元,就是Cache的一块。
2020.11.06
存储器容量,是指地址变换表的大小
5、习题二
解:
1)cache共有32块(页),那么地址变换表(标记对照表)就应该有32条记录,即包含32个存储单元
2)组相联标记 = 区号 + 页号
分为这么多个区:4096 / 32 = 212 / 25 = 27
每个区4块,就是4页: 4 = 22
所以每个存储单元(即标记)存放 7 + 2 = 9 位二进制数
3)区号直接索引,每次参与相联比较 4 个存储单元
2020.11.06
这个存储单元是比较含糊的,主要是要搞清楚它是存储一条比较记录还是一个位?从题干中可看到,是一条记录。