目录
指令系统运行过程中,CPU访存时间过慢导致CPU的等待,为了提升核心利用率,在主存和CPU之间增加高速缓冲存储器(Cache),也就是把经常使用的常数、常量、指令放在Cache中,来减少CPU访存时间,缩短指令的执行时间,从而提高计算机的性能。一般Cache采用高速的SRAM制作,其价格比主存贵, 但因其容量远小于主存,可以解决速度和成本之间的矛盾。
由主存地址映射到Cache 地址称为地址映射。地址映射方式很多,有直接映射(固定的映射关系)、全相联映射(灵活性大的映射关系)、组相联映射(上述两种映射的折中)。Cache为8K,主存为1M,块大小为512字,目标内存地址0240CH。
1、直接映射
直接映射,顾名思义就是按照Cache直接映射到主存,但是Cache对不上主存,怎么办?按照以下对应关系给匹配上。
Cachei块=主存j块 % Cache块数n,所以主存地址=标记+Cache行号+块内地址。
如Cache为8K,主存为1M,块大小为512字,Cache行号需要16行(8K=2^13字=2^4行*512字/行),对应主存地址(Line Number)需要4位。
1M=2^20字=2^11*512字/行=2^7块群*2^4块/块群*512字/行,对应主存地址(Tag)需要7位,剩余块内地址(Line Offset)需要9(20=7+4+9)。
内存地址0240C化为2进制为 0000 0010 0100 0000 1100
Tag(7) | Line Number(4) | Line Offset(9) |
0000001 | 0010 | 000001100 |
也就是说,0240C在Cache的第2行,主存的第18块(在第1块群的第2行)
我们来分析下直接映射的优缺点。
优点:实现简单,一个简单的求余公式就能知道对应关系。
缺点:如果CPU或外部设备访存的地址都是在"同余"里,Cache的命中率就不高了。如上面例子,主存第0块,16块,32块(Cache共16块)是在同余里,对应Cache都是第0块,那么CPU访存的时候,第0块的内容命中率相对低,而且需要不停得替换这一块的内容。
2、全相联映射
由于直接相联的同余缺陷,全相联就是为了解决灵活分配Cache地址,也就是说一个主存块可以装进Cache的任意一行。
那么主存地址需要标记+块内地址两个字段就可以完成匹配了。
如Cache为8K,主存为1M,块大小为512字,1M=2^20字=2^11*512字/行,对应主存地址(Tag)需要11位,剩余块内地址(Line Offset)需要9(20=11+9)。
内存地址0240C化为2进制为 0000 0010 0100 0000 1100
Tag(11) | Line Offset(9) |
00000010010 | 000001100 |
我们来分析下全相联映射的优缺点。
优点:每个Cache都可以映射任何一块主存,非常灵活。
缺点:每次访存的时候要知道是否在Cache中,都需要遍历整个Cache,时间开销大,实现较复杂。
3、组相联映射
由于直接映射与全相联映射的优缺点刚好相反,就有了第三种结合前两者的组相联映射。
组相联的主要思想是,把Cache所有行分为2^q个相同大小的组,每组有2^s行,也就是说组间按照直接映射的方式,组内按照全映射的方式。
那么主存地址就需要标识+Cache组号+块内地址组成了,Cache组号= 主存块号%Cache组数。
如Cache为8K,主存为1M,块大小为512字,若s=1(2路组相联),那么
Cache需要16组(8K=2^13字=2^3组*2^1行*512字/行),对应主存地址(Line Number)需要3位。
1M=2^20字=2^11*512字/行=2^8组群*2^3/组群*512字/行,对应主存地址(Tag)需要8位,剩余块内地址(Line Offset)需要9(20=8+3+9)。
内存地址0240C化为2进制为 0000 0010 0100 0000 1100
Tag(8) | Line Number(3) | Line Offset(9) |
00000010 | 010 | 000001100 |
也就是说,0240C在Cache的第2组,主存的第18块(在第2组群)
组相联映射结合了直接相联和全相联的优点,当q=0(只有一个组)的时候,那就是全相联。
当s=0(只有每组只有一行)的时候,那就是直接相联。