深入浅出话CACHE

Author: 圆圆 Date: 1997-01-01

#1  什么是CACHE
  所谓Cache,即高速缓冲存储器,是位于CPU和主存储器DRAM(Dynamic RAM)之间的规模较小的但速度很高的存储器,通常由SRAM组成。SRAM(Static RAM)是静态存储器的英文缩写。由于SRAM采用了与制作CPU相同的半导体工艺,因此与动态存储器DRAM比较,SRAM的存取速度快,但体积较大,价格很高。由于动态RAM组成的主存储器的读写速度低于CPU的速度,而CPU每执行一条指令都要访问一次或多次主存,所以CPU总是要处于等待状态,严重地降低了系统的效率。
  采用Cache之后,在Cache中保存着主存储器内容的部分副本,CPU在读写数据时,首先访问Cache。由于Cache的速度与CPU相当,因此CPU就能在零等待状态下迅速地完成数据的读写。只有在Cache中不含有CPU所需的数据时,CPU才去访问主存。CPU在访问Cache时找到所需的数据称为命中,否则称为未命中。因此,访问Cache的命中率则成了提高效率的关键。而提高命中率则取决于Cache存储器的映象方式和Cache内容替换的算法等一系列因素。
  在386以前的微机中,尽管内存的读写速度较慢,但由于CPU的工作频率也不高,因此对系统效率的影响并不太大。所以都没有采用Cache技术。对于32位微机而言,其CPU的速度比存取速度相对较低的DRAM存储器要快得多,为了实现速度上的匹配,只能插入等待状态延长存储器读写总线周期。这样做的结果是大大增加了系统的时间开销,降低了系统的速度。如果采用高速的静态RAM(SRAM)当然可以解决这个矛盾,但是SRAM体积大,价格高。因此,只能在对系统性能的要求超过对价格的考虑时才采用SRAM作主存储器。目前,在386以上的微机中解决速度匹配的最佳方案也只能是采用高速缓冲存储器Cache。
#1  CACHE的基本原理
  通过上面的介绍,我们知道Cache也是一种存储器,其工作速度很高,是为了解决CPU和DRAM主存之间的速度匹配而设置的。Cache可以看作是高速CPU和低速DRAM之间的接口,或者说,把Cache看成一个适配器来解决CPU和DRAM之间的速度匹配问题。CPU、Cache和DRAM三者之间的关系可用图1表示:
  当CPU要从存储器中读取一个数据字时,它首先在Cache中查找。如果找到了,则立即从Cache中读取并送到CPU中;如果在Cache中找不到,则用一个存储器读周期的时间从主存中读出这个字送到CPU,并且把包含这个数据字的整个数据块都从主存送到Cache中。之所以这样作,是因为存储器的访问具有局部性,也就是说连续读取的数据字一般在内存中都是连续存放的。调入一个数据块后,将使得以后若干次的访存都可以通过访问Cache来完成。如果调度算法得当,Cache的命中率可以很高。这样,从用户的角度看来,整个存储器(Cache+DRAM)就变成了既有Cache这样高的速度,又有DRAM这样大容量的存储系统了。这对于解决存储器这个瓶颈问题是十分有效的。
  综上所述,Cache有以下一些特点:
  ●Cache虽然也是一类存储器,但是不能由用户直接访问。
  ●Cache的容量不大,目前的微机中一般为256KB。其中存放的只是主存储器中某一部分内容的拷贝,称为存储器映象。
  ●为了保证CPU访问时有较高的命中率,Cache中的内容应该按一定的算法更换。
  ●Cache中的内容应该与主存中对应的部分保持一致。也就是说,如果主存中的内容在调入Cache之后发生了改变,那么它在Cache中的拷贝也应该随之改变。反过来,如果CPU修改了Cache中的内容,也应该修改主存中的相应内容。
#1  存储器映象
  所谓存储器映象问题是指如何确定Cache的内容是主存中的哪一部分内容的拷贝。存储器映象的方法,通常采用直接映象法和N路相联映象法。
  直接映象法是把主存地址空间分为大小相等的若干页面,每页的尺寸大小与Cache的大小相等,当CPU要访问的页面与Cache中驻留的页面相同时,即为命中。由于页内地址与Cache内的地址是一一对应的,因此在命中的情况下,直接读写Cache即可。若未命中,则需要进一步访问主存。这种主存地址映象方法称为直接映象法。
  N路相联映象常用的有二路相联、四路相联等映象法。它是把Cache存储器分为若干组,每组含若干行。主存的页与Cache的组大小尺寸相当。而Cache内容的交换以行为单位进行。因此在Cache中可同时存放多个页面,从而减少了页冲突。
#1  CACHE内容的更换
  为了提高命中率,我们总是希望在Cache中保存的是CPU经常要用或即将使用的那些数据。为了做到这一点,则必须按一定的算法,根据需要更换Cache的内容。
  Cache存储器分为两个基本部分,即数据存储器和标记(TAG)存储器。在数据存储器中存放的是主存中某部分单元的内容,标记存储器中存放的是对应主存单元的地址。处理器访问主存时,Cache控制器即比较地址与标记存储器的内容,若相同即为命中。
  直接映象方式下,若处理器读操作命中时,Cache对应单元的内容及其标记均保持不变,不作置换;而读操作未命中时,Cache控制器通知CPU直接访问主存储器,读出的数据在传送至CPU时也写入Cache,并修改标记。这就完成了对Cache内容的更换。在写命中时,同时修改Cache和主存对应单元的内容,标记字不改变;写未命中时,则除了要修改Cache和主存对应单元的内容外,还需要修改相应的标记。
在N路相联映象方式中,通常采用“最近最少使用置换法”(LRU算法)。这种算法的特点是,当未命中时,淘汰Cache中那些最近以来最少使用的单元的内容,进行替换。
#1  保持数据一致性
  由于Cache中的内容只是主存中相应单元的“拷贝”。因此必须保持这两处的数据绝对一致,否则就会产生错误。造成Cache和相应主存单元数据不一致的因素来自两个方面。一是CPU读入Cache数据作了修改后再写入Cache,而主存中相应单元的内容并未随之变化;二是在有多个设备对主存访问的情况下造成的。如多处理器或有DMA的系统,它们直接访问主存储器,修改了其中的内容,而Cache中的相应数据却未随之修改。
  对于第一种情况,即CPU修改了Cache的数据,如何使主存中相应单元的数据也随之修改的问题,通常有三种不同的方式。
  第一种方式称为“直写式”(Write-through),其原理是在CPU向Cache写入数据的同时,也把数据写入主存储器,以保证Cache和主存中相应单元数据的一致性。直写式系统简单可靠,但由于CPU每次更新Cache时都要对主存储器写入,因此速度受到了影响。
  第二种方式称为“缓冲直写式”(Posted Write),其原理是CPU在更新Cache时不直接更新主存中的数据,而是把更新的数据送入一个缓冲器中暂存,这样CPU就不必等待主存写入造成的延时而直接进入下一周期的操作,在适当的时候再把缓冲器中的内容写入主存中(例如在CPU读Cache的同时,把缓冲器的内容写入主存)。这种方式在一定程度上提高了速度,但由于缓冲器的容量有限,只能锁存一次写入的数据,如果发生连续的写操作,则CPU仍需要等待。
  上述的直写式或缓冲直写式不仅速度低,而且在很多时候向主存写入数据是不必要的。例如CPU可能多次对同一个Cache单元更新内容,实际上只需把最后更新结果写入主存即可,而不必更新一次Cache,就向主存写入一次。根据这种思想提出了第三种方式,称为“回写式”(Write-back),有的资料中也称为“写回”。这种方式的原理是CPU修改了Cache的内容后并不立即修改主存中相应的单元,而在被修改的Cache单元的内容将从Cache中淘汰时(如更换页面)才把它写入主存储器的相应单元中。回写式系统速度快,避免了不必要的冗余写操作,但结构上较复杂。当前的微机普遍采用回写式系统。早期某些版本的BIOS设置程序中要求用户根据机器的结构指定写入方法,如果设置错误,则微机不能正常工作。目前这一设置项已取消了。
  对于第二种情况,即多处理器或DMA直接访问主存储器造成主存和Cache中的数据不一致发生在以下情形:当主存中某单元内容调入Cache后,又由其它处理器或DMA更新了主存储器该单元的内容。为了避免这种情况下的数据不一致,通常采用以下三种处理办法解决:
  一种办法称为“总线监视”,即由Cache控制器随时监视系统的地址总线,若有其它部件向主存中写入了内容,则把Cache中相应单元的内容置为无效,CPU必须重新从主存中读入该单元的内容。
  第二种方式称为“主存监视”,由Cache控制器监视所有主存储器的读写操作,所有对主存的访问都必须通过Cache来完成。这样,凡对主存的写入也就对Cache中的相应单元进行拷贝。从而保证了两者数据的一致性。
  第三各方式是设置“不可Cache区”(Non-Cacheable Block)。这种方式的基本思想是在主存中开辟一块区域,该区域中数据不受Cache控制器的管理,不能调入Cache,CPU只能直接读写该区域的内容。其它总线设备也只能把数据直接写入该区域中。由于该区域不与Cache发生关系,也就不存在数据不一致的问题。不可Cache区方式是微机中最主要的方式,不少BIOS设置程序允许用户设置不可Cache区的首地址和尺寸,以及可Cache区的地址范围。
#1  内部CACHE和外部CACHE
  80486以及更高档微处理器的一个显著特点是在处理器芯片内集成了SRAM作为Cache,由于这些Cache装在芯片内,因此称为内部Cache(Internal Cache)或称为片内Cache。486芯片片内Cache的容量通常为8K。高档芯片如Pentium、Power PC等可达32KB,甚至更高。相对而言,片内Cache的容量不大,但是非常灵活、方便,极大地提高了微处理器的性能。片内Cache也称为一级Cache。
  由于80486等高档处理器的时钟频率很高,一旦出现一级Cache未命中的情况,性能将明显恶化。在这种情况下采用的办法是在处理器芯片之外再加Cache,称为二级Cache。二级Cache就是通常所说的外部Cache(External Cache),它实际上是CPU和主存之间的真正缓冲。由于系统板上的响应时间远低于CPU的速度,如果没有外部Cache就不可能达到486等高档处理器的理想速度。外部Cache的容量通常应比内部Cache大一个数量级以上。在系统设置中,常要求用户确定是否允许使用内部和外部Cache,在禁止使用内部或外部Cache时,系统速度将有显著的降低。外部Cache的大小一般为64KB、128KB或256KB。在486以上档次的微机中,普遍采用256KB同步Cache。所谓同步是指Cache和CPU采用了相同的时钟周期以相同的速度同步工作,相对于异步Cache,性能可提高30%以上。
#1  CACHE读写周期和等待状态
  Cache是由SRAM组成的,与DRAM一样,需要根据其存取速度来确定读写周期的长短。如SRAM速度较低(如35ns以上)而系统时钟较高时,也需要有等待状态。BIOS设置程序中,一般也要求用户具体设置。对于有自动设置的BIOS设置程序,选定该项为Enabled即可。