CPU对存储器的访问,通常是一次读写一个字单元。当CPU访 Cache不命中时,需将存储在主存中的字单元连同其后若干个字一同调入Cache中,之所以这样做,是为了使其后的访存能在Cache中命中。因此,主存和Cache之间一次交换的数据单位应该是一个数据块。数据块的大小是固定的,由若干个字组成,且主存和Cache的数据块大小是相同的。
从Cache-主存层次实现的目标看,一方面既要使CPU的访存速度接近于访Cache的速度,另一方面为用户程序提供的运行空间应保持为主存容量大小的存储空间。在采用Cache-主存层次的系统中,Cache对用户程序而言是透明的,也就是说,用户程序可以不需要知道Cache的存在。因此,CPU每次访存时,依然和未使用Cache的情况一样,给出的是一个主存地址。但在Cache-主存层次中,CPU首先访问的是Cache,并不是主存。为此,需要一种机制将CPU的访主存地址转换成访Cache地址。而主存地址与Cache地址之间的转换是与主存块与Cache块之间的映射关系紧密联系的,也就是说,当CPU访Cache未命中时,需要将欲访问的字所在主存中的块调入Cache中,按什么样的策略调入,直接影响到主存地址与Cache地址的对应关系,这也就是本小节要解决的主存与Cache的地址映射问题。 主要有三种地址映射方式,分别为全相联映射、直接相联映射和组相联映射。
1.全相联映射方式
主存中一个块的地址与块的内容一起存于cache的行中,其中块地址存于cache行的标记部分中。
这种方法可使主存的一个块直接拷贝到cache中的任意一行上,非常灵活。
它的主要缺点是比较器电路难于设计和实现,因此只适合于小容量cache采用。
全相联映射的示意图演示
2.直接映射方式
这也是一种多对一的映射关系,但一个主存块只能拷贝到cache的一个特定行位置上去。
cache的行号i和主存的块号j有如下函数关系:i=jmod m (m为cache中的总行数)
直接映射方式的示意图演示
直接映射方式的优点是硬件简单,成本低。
缺点是每个主存块只有一个固定的行位置可存放,容易产生冲突。因此适合大容量cache采用。
直接映射的示意图演示
3.组相联映射方式
这种方式是前两种方式的折衷方案。它将cache分成u组,每组v行,主存块存放到哪个组是固定的,至
于存到该组哪一行是灵活的,即有如下函数关系:m=u×v 组号 q=j mod u
组相联映射的示意图演示
组相联映射方式中的每组行数v一般取值较小,这种规模的v路比较器容易设计和实现。而块在组中的排
放又有一定的灵活性,冲突减少。