cache的工作一般是CPU给出一个地址,然后这个地址按照不同映象方式分割地址位,每一次都从这个地址中取出一部分,然后按照对应的判断方式判断该数据是否在cache中,并找到对应的地址
一、直接映像
将主存分成若干个区,每个区的大小和cache的大小是一样的,然后每个区都分成若干个块,每一次只能将一个区
整体移入cache中,在寻找的时候,先通过地址块号找到映象关系表中的分区号,然后将分区号与对应地址位对比,若
比对成功,则读写cache的对应块的数据,若不成功,则访问主存中的数据,并考虑是否写入cache。
映象关系表:包含区号和装入值(该块是否有数据),块号由于是固定的,所以cache表中的块号 = 主存地址块号%
cache的块数。
特点:主存中的每一个块只能对应cache中的唯一一个块
访问速度较快
硬件实现简单
cache利用率不高(块利用率较高)
块冲突率较高(两个块映射到同一位置)
一般小型器件使用
映象方式:
1、装入值可以理解为一个标志位,标志该项是不是为空
关系对应表
二、全相联映像
将主存分成若干个块,cache也分成若干个块,在访问时,先读取地址的块号,然后从关系映象表中顺序查找,若
找到相同的块号,则将后面的cache块号取出,访问cache。
特点:主存中的每一个块都可以随机映射到cache中的每一个块
cache利用率较高
速度比较慢
电路也比较复杂
映射方式:
关系映射表:
三、组相联映像
将主存分成若干个区,每个区又分成若干个组,每个组又分成若干个块,关系影响表中存储两部分内容,一部分
是由主存中区号和块号组成的数据,另外一部分是存储cache中的块号。工作时,先取出表示组号的地址,然后到关
系映象表中对应组区,将区号和块号拼接成一份数据,然后从对应位置开始顺序查找,找到则将cache组号找出,到
cache中读写数据
特点:主存的每一组只能映射到cache中对应的组,但是组内的块却可以映射到对应组的任意位置。
cache利用率较直接映象有所提高
速度较全相联映象有所提高(综合二者优点)
电路更为复杂
块冲突率较低
一般大型器件使用
映射方式:
映射关系表:
1、对于三种映象来说:找到了就到cache中存取数据,没找到就要从主存中读取数据,并考虑是否将主存数据写入cache。
四、替换法则:
当需要向cache中添加主存数据,而cache内存却不够了,这时就要使用替换规则来解决这一问题
1、随机替换法:将cache中的随机一块替换成主存中的数据
特点:
性能比使用情况的替换算法差,命中率低
不能正确反映出块的局部性
2、先进先出法(FIFO):将cache中最先进入的数据替换
特点:
实现容易,开销小,但不能正确反映程序的局部性
3、近期最少使用算法(LRU):将最近使用最少的替换
特点:
需要记录cache中各个块的使用情况
LRU替换算法的平均命中率比FIFO要高,并且当分组容量加大时,能提高LRU替换算法的命中率
硬件实现复杂
1、局部性
2、经验之谈:起初学习的时候,将重心放到了主存和 cache 的关系映象表上面,意图先理清楚映象表,然后通过
这个表回溯到主存和 cache 中,后来撞了许多墙后才发现,映象表是两个对象的关系,这个关系和两个表是相互
关联的,而且是随着两个表的不同而实时发生变化的,在回溯的过程中也会发生许多的问题,所以后来就放弃了
这个思路,重新从主存和cache本身出发,然后理清楚两个表的相互映射关系,那么关系表就自然生成了,新学习
的朋友们可以从主存和cache本身出发,这样也许会掌握的更加快一些,当然如果你记忆力和理解能力超强,就当
我没说