cache介绍

时间:2024-03-04 14:17:38

前面已多次提到了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。

 

1.先入先出,新写入的块取代最先存放到Cache中的旧块。
2.随机替代,新写入的块随机地取代Cache中的旧块。
3.最近、最不常用替代方式(LRU,Least Recent Used),新写入的块将取代Cache中最少被CPU访问的旧块。

  不难看出,第三种方式的效率最高,能有效地降低失误率,因此这也是目前大多数Cache所采用的块替代方式。此外,在CPU的读取操作中,Cache中的数据与主内存上的数据是一致的。但是当CPU向Cache写入新的数据时,则会出现Cache与主内存之间数据不一致的情况。解决的方法有两种: 1.写通(Write through)当CPU向Cache写入数据时,同时也把数据写入主内存,或同时把数据写到一个缓冲器中,待CPU空闲时再把数据写入主内存。此方式简单可靠,但由于CPU每次写入数据时都要同时对主内存的相应数据进行刷新,因而速度较慢。

2.写回(Write back)

  当CPU要进行写入操作时,只把数据写入Cache,而不直接写入主内存。这时,Cache与主内存之间会出现暂时不一致的数据块。当Cache中的不一致数据块将要被替代时,再把数据写回主内存,从而使Cache中的数据与主内存中的数据又再保持一致。在此方式下,需要在Cache中加入一个控制位(Dirty bit),若Cache中的某数据块是由CPU写入的,则控制位=1,否则控制位=0。发生块替代时,Cache先检查被替代块的控制位,若控制位=0,则无需把内容写回主内存,若控制位=1,则执行写回操作。这样做的好处是当CPU多次刷新同一数据块时,只需把最后的结果写回主内存即可,从而避免了重复写入,因而具有较高的效率。在早期版本的BIOS中,用户还可以对采用写通方式还是写回方式进行设置,但在新版本的BIOS中已取消了这一设置。

  以上数据写入都是由CPU执行的,但若是DMA的系统,由于其它设备也可能向主内存写入数据,这时同样会造成Cache中的数据与主内存数据不一致。所以,目前个人计算机系统大多采用了一种称为Non-Cacheable Block(非可Cache块)的解决方法。其原理是在主内存中开辟一块专门的区域,所有对内存直接进行写入操作的设备都只能把数据写入该区域。同时,该区域中的内容不会被写入Cache中,因此Cache中的数据与Non-Cacheable Block 中的数据互不干扰,也就不会发生不一致的情况。

  注:DMI(Desktop Management Interface桌面管理接口)是用来让系统保存自身及外围设备相关资料的应用程序。通过DMI可以在操作系统级查询系统配置信息,而不用进入BIOS,包括CPU、内存、I/O扩充插槽等。DMI可以将上述资料存储在BIOS中的特定位置,也可以利用DMI对资料库中系统配置情况作出修改以适应不同环境的系统需求。主板上的BIOS会尽可能地收集系统信息,将它存在主板上Flash EPROM中一个4K的小块中,DMI可以恢复数据库中的系统信息―这个数据库叫作MIFD(Management Information Format Database)。该BIOS允许动态实时更新DMI信息,DMI还允许在手工加入BIOS时不能探测到如使用者姓名、销售商、计算机编号等信息。Flash EPROM与Flash ROM的作用相类似。

  上面说明了Cache的工作方式。在实际应用中,还有异步与同步Cache之分,这也是高速缓存的工作方式。在异步Cache工作方式下,CPU每次访问Cache的开始时都需要额外消耗一个时钟周期来查找特征位。同步Cache则是把按地址进行查找的过程分配到两个以上的时钟周期上完成。在第一个时钟周期内,Cache先将地址存放到一个寄存器中,而在第二个时钟周期内,Cache再把把数据传送给CPU。由于地址已被保存在一个寄存器中,所以同步Cache可以在CPU读取前一次数据的同时接收下一个数据地址,而不必另花时间来接收附加地址。目前大多数主板所采用的同步Cache称为管道突发式(Pipelined burst)Cache。能更加快速地访问从内存中读取的连续数据。

  Cache可分为L1 Cache与L2 Cache两部分。这也就是BIOS设置中的Internal Cache(内部Cache)与External Cache(外部Cache)。L1 Cache介于CPU与L2 Cache 之间,而L2 Cache 则介于L1 Cache与主板之间,上面所述的Cache就是前面的L2 Cache。

  注:过去L1Cache已集成到CPU内部,而L2 Cache则焊接在主板上,早期的奔腾CPU已把L2 Cache集成在芯片上,这样L2 Cache将与CPU工作在同一频率上,从而实现了真正的零等待。但在奔腾 II中,Intel采用了既兼顾成本,又考虑性能的折衷方案:将CPU与L2 Cache分开,但又焊接在同一块电路板上,并一起封装,L2 Cache的工作频率是CPU主频的一半。这就是有人把奔腾Pentium II称为奔腾pro加MMX的原因。而奔腾赛扬(Celeron)处理器为降低成本,取消了芯片上的L2 Cache,因此有人把赛扬称为简装奔腾II。而在赛杨300A中,又加入了128K L2