(4)cache的不同映象方式与命中率的关系

  前面讲过cache的三种映象方式。全相联映象方式很难实用,直接映象方式命中率略低,多路但相联映象方式性能/价格比更好,2路、4路相联最常用,8路及更多路组相联映象不常用。我们用一个cache控制器的实例Intel82385来深化一下对直接映象和多路组相联的认识。

  Intel 82385是用于为PC 386机配置cache存储器系统的。工作于16MHz或20MHz,并且以32位的字为单位实现主存向cache传送数据,82385并不是一个完整的cache存储器系统,它只是cache系统的控制器,cache中的数据要保存在另外的SRAM芯片中,82385支持直接映象和两路组相联映象两种运行方式。

  在直接映象方式下,需要把PC 386机30位的字地址分成为如图4.21 所示的三个组成部分(32位地址中最低2位用于选择一个字中的4个字节,此处不用这2位)。


图4.21 30位的内存地址的3个字段

  Intel 82385能用于对应PC机80386的4GB(1G字)的存储空间,cache的容量为8K字,被分成1024组,每组由8个字组成。为此,为每组在82385中设立1个入口,合计为1024个,其编号分别为0,1…,1023。每一个入口中,除保存17位的标记字段的内容之外,还再设一个标记有效位,设8位的字有效位,分别指明该组中的8个字的有效装入,故82385的总容量为1024×26位。同时,把主存也分成8个字的组,1024个组构成一页,则每页中的0组只能映射到cache的0组中,1组只能映射到cache的1组中,依此类推,故这是直接映射方式。把8个字划分为一组,是为了减少82385的入口数,为每8个字分配一个17位的标记字段,再补加8位有效位就可以了,而不是为每个字分配一个20位的标记字段(这样做需要在该芯片内设置8K的入口数)。读cache时,用10位的组选择地址,3位的字选择地址去选择cache的SRAM中的一个字数据,并用高17位地址与82385中的一个入口中(由10位的组选择地址决定)的17位的标记字段的值比较,若相同,且标记有效位和对应的字有效位(由3位的字选择地址决定)均为1,则为命中,读出SRAM选中的单元中的数据送CPU;若不同,或标记有效位为假,或标记有效位为真但相应的字有效位为假,都是不命中的情况,需到内存中完成读操作,并相应的变更cache系统中的有关内容。

  在两路相联映象方式下,就要把cache分成两个独立的体(Bank),82385表现为两个512个入口的cache控制器,cache的数据字段也分成为两个4K字的存储体。而主存相应地被分成4K字为一页的多页结构,即页数比直接映象方式的页数多出一倍,故82385中的有效标记位变成18位,而组选择地址字段由10位减少为9位,1位标记有效位和8位字有效位不变。此外,在每个入口中还多出用于cache换字处理的1位,称为LRU,以保证在需要换出两个体中的一个字时,能采用最近最少使用的算法从两个体中合理地换出一个字。读cache时,用9位的组选择地址同时读两cache的SRAM中的数据,并用最高的18位地址去同时与cache控制器的两部分入口 (两个体)相应单元中(由9位的组选择地址决定)的标记字段的内容相比较,并检查它们的标记有效位和字有效位(由3位的字选择字段决定)的取值情况,以确定本次读操作命中与否。
下面就3种映象方式的同异之处做一个简单的对比。