2、直接映象及其变换 |
图 5.26 直接相联映象方式 |
![]() |
图 5.27 直接相联地址变换 |
根据前面给出的地址映象规则,整个Cache地址与主存地址的低位部分是完全相同的。在图5.27中,主存地址中的块号B与Cache地址中的块号b是完全相同的。同样,主存地址中的字内地址W与Cache地址中的块内地址w也是完全相同的。主存地址比Cache地址长出来的部分称为区号E。 在程序执行过程中,当要访问Cache时,为了实现主存块号到Cache块号的变换,需要有一个存放主存区号的小容量存储器。这个存储器的容量与Cache的块数相等,字长为主存地址中区号E的长度,另外再加一个有效位。 直接映象方式的地址变换过程如图5.27所示。首先用主存地址中的块号B去访问区号存储器(按地址访问)。把读出来的区号与主存地址中的区号E进行比较,根据比较结果和与区号在同一存储字中的有效位情况作相应的处理。 如果区号比较结果相等,有效位为"1",则Cache命中,表示要访问的那一块已经装到Cache中了,这时的Cache地址是正确的。用这个Cache地址去访问Cache,把读出来的数据送往CPU。其它情况均为Cache没有命中,或称为Cache失效,表示要访问的那个块还没有装到Cache中,这时,要去访问主存储器,把读出来的一个字送往CPU。同时,把包括被访问字在内的一块都从主存储器中读出来。 如果区号比较结果相等,有效位为"0",表示Cache中的这一块已经被作废,这时,要把从主存中读出来的新块装到Cache中,并且把有效位置"1"即可。如果区号比较结果不相等,有效位为"0",表示Cache的这一块是空的。这时,只要把从主存中读出来的新块装到Cache中,并把有效为置"1"即可。另外,还要把主存区号写到区号存储器的相应单元中。 如果区号比较结果不相等,有效位为"1",表示原来在Cache中存放的那一块是有用的,这时,必须先把Cache中的这一块写回到主存储器中原来存放它的存储单元中,腾出地方来,才能把从主存中读出的新块装到Cache中。另外,也要把主存区号写到区号存储器的相应单元中。 为了提高Cache的访问速度,可以把图5.27中的区号存储器与Cache合并成一个存储器,如图5.28所示。这样,用主存地址中的块号B访问Cache,把区号和这一块的所有数据同时都读出来。由于Cache中一块的字数很少(1至16个),通过一个多路选择器,在块内地址的控制下,把所需要的那个字选出来送往CPU。如果Cache没有命中,处理方法与图5.27中的相似。 图5.28所示的Cache,它的访问速度要比图5.27的快得多,多路选择器的实现也比较容易。在前面介绍的并行和交叉访问存储器中,从多个存储体中读出的数据也采用多路选择器输出。两个多路选择器是完全相同的。 直接映象方法的优点是硬件实现很简单,不需要采用相联访问的存储器,访问速度也比较快。实际上,采用直接相联方式的Cache不需要进行地址变换,因为主存地址的低位部分就是Cache的地址。 直接映象方式的主要缺点是块的冲突率比较高。当主存中的两个或两个以上块都映象到Cache的同一块中,而这些块又都是当前的常用块时,Cache的命中率会很低。这时,即使Cache中还有很多空闲的块,也帮不上忙。 在IBM370/158等计算机中采用直接映象方式。 |
图 5.28 快速的直接相联地址变换 |