前面已多次提到了Cache,这可是一个讨人喜欢的东西,您有必要详细了解它的作用与原理。Cache是介于CPU与主内存之间、或者主内存与磁盘之间的高速缓冲器,其作用是解决系统中数据读写速度不匹配的问题。其中介于CPU与主内存之间的缓冲器又称为RAM Cache,而介于主内存与磁盘驱动器之间的缓冲器则称之为Disk Cache,这里要讨论的是前者,也就通常简称的Cache。
那么,Cache是怎样工作的呢?您一定明白CPU的运算速度比主内存的读写速度要快得多,这就使得CPU在访问内存时要花很长的等待时间,从而造成系统整体性能的下降。为了解决这种速度不匹配的问题,需要在CPU与主内存之间加入比主内存更快的SRAM(Static Ram,静态存储器)。SRAM储存了主内存中的数据(专业术语称为“映象”),使CPU可以直接通过访问SRAM来读写数据。由于SRAM的速度与CPU的速度相当,因而大大缩短了数据读写的等待时间,系统的整体速度也就得到了提高。既然SRAM那么快,为什么不用来作为主内存呢?这是因为SRAM采用了与CPU相类似的半导体制造工艺,成本极高,只有在那些只关心性能不考虑价格的场合才会这样做。这也就使得Cache粉墨登场了,它能将CPU用过的数据,以及结果保存起来,让CPU下次处理时先来访问Cache,如果没有可用的数据再去别处找,以此来提高运行速度。
Cache由标记存储器和数据存储器两个基本部分组成。标记存储器是用来储存Cache的控制位与块地址标签,控制位用于管理Cache的读写操作,而块地址标签则记录着Cache中各块的地址。这个地址包含了与主内存映射的块地址,并且都与Cache中的一块“数据”相对应。而这块“数据”正是贮存于Cache的数据存储器中。当CPU读取数据时,先通过地址总线把物理地址送到Cache中,与Cache中的块地址标签进行对比。若相符合,则表示此数据已经存在于Cache中(此情况被戏称为“命中”),这时只需把Cache中的对应数据经由数据总线直接传送给CPU即可。但如果CPU送来的物理地址无法与Cache中的块地址标签相符,则表明这一数据不在Cache中(称为“失误”),这时,需要由主内存把CPU所需的数据地址拷贝到Cache中,再由Cache把数据传送给CPU。从这个过程我们可以看到,若CPU读取“命中”,存取速度确实可以提高许多,但如果“失误”,则Cache的存在反而减慢了CPU的读取速度。因此,采用何种技术和方法提高读写命中率、减少失误率,就成了Cache设计的关键。加大Cache的容量当然可以提高命中率,但因成本问题,Cache不可能无限增大,但可以通过采用适当的映射方式和块替代方式来提高命中率。
所谓映射方式是指Cache中的数据如何与主内存中的数据相对应的问题。映射方式通常有以下三种:
直接映射
如果主内存上的块只能映射到Cache中的特定块,我们称这种映射方式为直接映射。直接映射的存取速度最快,但失误率也最高。
完全映射
在这种映射方式下,主内存上的块可以映射到Cache的任意块之中,当CPU欲读取某一个块时,Cache会把CPU送来的地址与Cache中的所有地址标签进行对比。由于是完全对比,因此存取时间最长,但失误率也最低。
结合映射
这种映射方式是把Cache分成若干个页面,每个页面会有相同数目的块。主内存中数据块可以映射到Cache中指定页面的任一块中。这种映射方式可以看成是直接映射与完全映射的折衷,是效率最高的映射方式。
由上可见,结合映射方式最为理想,也是应用最为广泛的映射方式。但由于Cache的容量比主内存要小得多,因此无论采用何种映射方式,失误都在所难免。由于当CPU的存取出现“失误”时,必须从主内存把相应的块地址与数据写入Cache中,若此时Cache已经饱和,写入的数据必然会覆盖掉Cache中原有的数据,这就是“块替代”。那么,采用何种块替代方式可以最大限度的减低失误率呢?可以采用的方式又是什么呢?是这么三种:
Cache。 |