0. Cache工作原理
1. 直接映射
下面针对该映射方式,举一个小例子:
当缓存接收到CPU发送来的主存地址后,只需根据中间c位字段(假设为00…01)找到缓存块1,然后根据字块1的”标记”是否与主存地址的高t位相符合,若符合且有效位为1(这里的有效位用来识别Cache存储块中的额数据是否有效,因为有时Cache中的数据是无效的,例如,在初始时刻Cache中的额内容为空,是无意义的),则表示该Cache块已和主存中的某块建立了对应关系,则可根据b位块内地址从Cache块中取得对应的字,即找到CPU发来的主存地址在缓存中所对应的信息;若不符合,或者有效位为”0”,则主存读入心得字块来代替旧的字块,同时将信息送往CPU,并修改Cache“标记”位。如果有效位为”0”,还得将有效位置为 “1”。
优缺点
小结: 直接相联映射方式的缺点是不灵活,每个主存块只能按照取模固定地映射到某个缓存块,即使缓存内其他块空着,也不能用来映射。因而如果程序恰好要重复地使用对应同一缓存块的不同主存块,那么久需要不同的替换,这样会降低命中率。
计算方法
2. 全相联映射
为了解决直接相联映射不灵活的问题,出现了全相联映射。全相联映射不是通过字块号来寻找字块,而是将主存地址中的标记与缓存中每个字块的标记进行比较,如果找到与之相同标记的缓存块,则表明所访问的主存地址在缓存中,之后在Cache中找到缓存块后,再根据主存地址的低b位找到块内地址,这样就找到对应的字,也就是需要的数据。因而在这种映射方式下,主存地址中只需要主存字块标记和字块内地址就行。具体的映射和主存地址格式如下:
全相联中的t,c,b,m和直接映射中的都一样,所以计算方法同上。
优缺点
全相联映射允许将主存中的每一字块映射到Cache中的任意一块位置上。显然这种映射方式相对于直接映射,更加灵活,因而命中率也更高,缩小了块冲突。
由于需要将主存地址中的标记与每一个缓存块的标记进行比较,也就使其具有了”按内容寻址”的特点。同时也因为这个特点,所需的逻辑电路较多,成本也比较高,实际的Cache还要采用各种措施来减少比较次数。
3. 组相联映射
针对上述直接映射和全相联映射出现的问题,现在出现一种折中的映射方式,即下面介绍的组相联映射。该映射方式将所有Cache分为Q组,每组有R块,则有以下关系:
i =j mod Q
其中 i,j 的含义与直接映射中的含义一致。上述表达式意思即为某一主存块按模Q将其映射到缓存的第i组内,具体步骤即主存地址格式如下:
Tips
字块内地址解析:
例题
1.
4).要求主存地址格式,首先可以求字块内地址,由于按照字节编址,即按照字节访存,则最小数据单元为字节,那么每个字块内有16∗32/8=64 个最小访存单元,每个单元有一个地址,那么字块内就有64个地址,这样的话字块内地址就需要6位,即在直接映射下主存地址中b=6,由于Cache共有64个字块,所以需要6位即有2^6地址才能访问到每个Cache块,即c=6位,所以最终 主存字块标记位数=主存地址数-字块地址数-字块内地址数,即t=19-6-6=7位,所以得到主存地址格式为:
2.
(2).在全相联映射下,主存地址仅由字块内地址和主存字块标记构成,而字块内地址在(1)中求得为2位,所以这里的字块内地址为19-2=17位。此时的主存地址格式为:
(3).在二路组相联映射中,每组有两个字块,所以一共有210/2=29组,故组地址有9位,即q=9,由于每个字块到这里都是没有变化的,所以字块内地址仍为2位,即b=2,所以主存字块标记为19-9-2=8位,故得到主存地址格式为:
(4).主存容量为512K*32位,即双字宽存储器,即每次可以访问两个字(最小访存单元),这里的访存地址单元仍为字没有变,并且块长仍为4个16位的字,所以字块内地址仍为2位,而主存容量可以改写为512K X 32位=1024K X 16位,这样就可以得到共有1024K个字,即220个数据单元,地址数为220,所以主存地址有20位。同时,这里改为四路相联组映射,即每个Cache组内有4个Cache块,所以共有210/4=28组,所以组地址为8位,即q=8,这样得到主存字块标记有20-8-2=10位,得到如下主存字块地址格式: