cache-主存体系
- cache和主存,cache使用SRAM构成的,速度快容量较为小但是价格昂贵;主存/内存使用DRAM构成的,速度较慢但是容量且价格便宜;
- 所以使用cache-主存体系来使得速度接近cache而容量等于主存且价格较为便宜注意是容量等于主存而不是大于,因为,cache里边的内容都是主存的拷贝,所以并没有扩充容量;
- cache-主存体系的设计思想依据:程序的时间局部性和空间局部性;
- 什么是时间局部性?程序被访问后的某一段时间内还可能被访问,比如循环冒泡排序等;
- 什么是空间局部性?CPU访问某个存储单元后还可能访问它的相邻存储单元;
- cache对于CPU来说是透明的,对于CPU来说,感觉上还是在直接访问主存,可以用如下图来表示:
CPU对cache 和 主存的访问都是按字节访问的,但是cache 对 主存的访问时按整块进行的;
如果CPU访问的内容不在cache ,则CPU直接访问主存的存储单元,同时把这一块放在cache中,那么下一次再访问时访问cache的概率会增加;(目的就是进肯能让CPU的访问尽可能在cache中完成);
cache和块
- 块就是把把一些相邻的存储单元放在一块,通常以2n个存储单元为一个块,并且cache 和 主存的块要对齐;
- 当块分好之后,块号的变化是一致的,此时CPU访问的地址可以写成块号+块的偏移地址的形式;
- CPU给定存储单元的地址之后,低位(块的偏移地址)给定后,就确定了在什么地方,因为主存中的块可能放在cache中的不同位置,但是无论在哪,只要找到块号,然后直接加上偏移地址就是要访问的地址;(就是建立了cache和主存的块号的映射)
三种关联方式(cache到主存的映射方式)
根据主存中“块”在Cache中“行”的放置限制和地址映射方法,可以分为:
全相关联映射:主存中的一块可以放置到Cache的任意行
直接关联映射:主存中的一块只能放置到Cache的特定行
组相关联映射:主存中的一块只能放置到Cache的特定组,在组内可以放置到任意行
1. 全相关联映射;
如图假设图中有cache有8行,内存中美分为256块,cache的前半部分是标记(8位)正好对应内存中的块号,而后半部分则是每一块中的所有地址(标记+偏移地址)构成的存储单元;看下一张图你就明白了:
全相关联映射的优点是:冲突率小,cache的利用率高,缺点是比较器难实现,需要一个访问速度很快代价很高的相连存储器(多路比较器);==因为CPU给定存储单元的地址之后,需要首先拿CPU给定地址记为add1的块号和所有的cache的块号进行比较,如果命中(就是cache中存在和add1的块号相等的标记),那么就把块号+便宜地址(add1的偏移地址部分)就得到了在cache中的位置;否则的话就是未命中,未命中的话地址必定存在内存中;于是使用同样的方法去遍历,然后找到(一定能找到);
2.直接关联映射
采用类似哈希表的思想对内存地址到cache中的地址进行映射;
采用如下的公式进行映射:cache放置的行号==内存块号%Cache行数;映射后内存中的某块放在cache中的哪一行取决于低三位(本例中是第三位,实际上加入cache有n行,应该是低log2(n)位);
由于在这种映射的方式下,每行放置的块号的后三位是确定的(都是一样的比如00000 000 和 00001 000)所以cache中的标记只需要存放5位即;下图中的r=行号(000~~111)S表示块号,字就是地址偏移量,S和字和上边的是相同的,只不过新加了r为行号;
所以当CPU给出一个存储单元的地址之后,这个地址即为add1,取出add1的tag段,就是块号-第三位,放入比较器中和cache中的标记(5位,也是块号-3位)进行比较如果存在的话就找到了,在加上偏移地址就是cache中的地址,一共是s-r+偏移地址,因为不需要行号,本身cache中也没存,但是如果没匹配上,就需要加上行号r再去主存中找;
3.组关联映射
组关联映射算是上述两种方案的一种折中方案;同直接映射,只不过是块号的低位映射到cache的组号,cache组内可以任意放置;
映射公式如图中:cache中放置的组号==内存块号%cache组数;
类似直接映射,cache的标记位存放6位,然后记为CPU给定地址为add1,从add1中取出块号-组号和cache中的标记对比,如果存在,就在cache中对应的组再加上偏移地址,就找到了地址,否则,不存在,add1的块号-组号再加上组号+偏移地址后再在主存中寻找改地址;