Cache工作原理-2

来源:互联网 发布:淘宝商家怎么收款 编辑:程序博客网 时间:2024/04/30 21:30

2.4.2 CACHE 组织结构

  映射方式
  替换策略

  前面已提到,与主存容量相比,cache的容量很小,它保存的内容只是主存内容的一个子集;又说过,cache与主存的数据交换是以块为单位,还说过对cache的使用是透明的,即:是以硬件实现的,那么,被保存的主存块在cache中应如何排放才能迅速被检索以判断命中与否,实现电路既不太复杂又不损害命中率。还有,当cache已满,无空余位置时,新的主存块到来必须将一个原有块换出,这种替换应该如何进行。这都涉及到cache内部的组织方式,下面分两个问题来介绍,最后介绍一个实例。

  一.映射方式

  cache的存储器按与主存交换数据块的大小划分成行(line),用Li表示,其中i012m-1,共有m= 行,主存的块用Bj表示,其中j = 012n-1,共有n = 块。行与块是等长,设每个块(行)由k = 个连续的字(这里的""是指可存取的最小单位)组成。图229给出此cache/主存结构的示意。显然,n>>m, s>>r。组{Bj}到组{Li}可定义出几种映射方式。
  这里的"映射",其物理含义就是位置对应关系,即将CPU给出字的主存地址变换成可能含有此字的cache行位置,使用cache的动力在于它的高速,因此也要求这个地址变换过程尽可能地快,故此过程是以硬件完成的。这带来的另一好处是cache的透明性,除了程序运行速度提高之外,用户包括系统软件编制人员,丝毫未感觉到cache的存在。

  下面分别介绍常用的三种主要映射方式,
  1.全相联映射方式
  全相联映射(fully associative-mapping)常简称为相联映射,这种方式是将一个主存块的地址(块号)与块的内容一起都存于cache行中。块地址保存于cache行的标记(tag)部分中。这种带着全部块地址一起保存的作法,直接结果是一个块可以拷贝到cache的任意一行上,极其灵活;但这也带来查找困难,对于一个指定的内存地址必须将其块号与cache所有行的标记同时关联比较,而不是逐行的顺序比较。全相联映射方式的cache检索与映射示于图230
  为了直观,图230中内存的排放采用与cache等容量的块组为一列,逐列排放的方式。图中cache由三部分组成:
  ·行组成的数据缓冲部分;
  ·存放各行对应内存块地址(块号)的标记部分;
  ·每行有一个有效位标志V,当V=1时,该行的标记参与同时关联比较,V=0时,该行无效,不能参与同时关联比较,无效行只能作为被替换填入新行时使用。
  在对标记的同时关联比较命中时,由命中行的行号与cache行的字号相加,找到该访问字,若是读操作,该字直接由此输出,若是写操作,直接修改该字(详见后续内容)。
  在对标记的同时关联比较未命中时,由物理地址直接寻址内存,找到该字,若是读操作,该字直接由此输出,同时将该字所在的内存块整体映射到cache的任意一个无效行,若此时cache中没有无效行,要根据某种算法找出一行,使它强行无效(置V=0)后添入该字所在的内存块,并将标记填入标记区,然后置V=1。若是写操作,修改该字的操作详见后续内容。

  全相联映射方式的主要缺点是比较器电路难于设计与实现,尤其是cache的行数较多时。一般是将全部标记用一个关联存储器实现,全部数据用一个普通RAM来实现,即全相联cache由一个关联存储器和一个RAM组成。关联存储器价格贵、容量小,但可以按内容而不是按地址实行检索。全相联映射方式只适合于小容量cache采用。
  2.直接映射方式
  直接映射(direct mapping)方式虽然也是多对一的映射关系,但一个主存块只能拷贝到cache的一个特定行位置上去。块号j与保存此块的行号i有如下关系: ij MOD m mcache总行数) 28更详细说明这种映射关系:

 

  此方式是将s位的块地址分成两部分,低序的r位作为cache的行地址,高序的s-r 位作为标记(tag)与块数据一起保存在该行。当以一个给定内存地址检索直接映射式cache时,首先以此地址中的r位行号部分找到此cache行,再将地址最高的s-r位与此行的标记进行比较。若相符即找到所要求的块,然后用地址最低的w位查找并读取最终所要求的字。若不符,则未命中。图231是直接映射cache的检索过程。 同样为了直观,图231中内存的排放采用与cache等容量的块组为一列,逐列排放的方式。于是处于同一水平位置的内存块只有一个处于同一水平位置的cache特定行建立映射关系,此时r位的物理地址既是cache的行号又是内存一列中的块号。标记仅为地址最高的s-r位。
  在对标记按r位进行选行比较命中时,由命中行的行号与cache行的字号相加,找到该访问字,若是读操作,该字直接由此输出,若是写操作,直接修改该字(详见后续内容)。
  在对标记按r位进行选行比较未命中时,由物理地址直接寻址内存,找到该字,若是读操作,该字直接由此输出,同时将该字所在的内存块整体映射到cache同一水平位置的特定无效行,若此时cache的特定行不是无效行,要使它强行无效(置V=0)后添入该字所在的内存块,并将该块的标记填入cache该行的标记区。若是写操作,直接修改该字(详见后续内容)。
  直接映射方式因只按r位进行选行比较,故比较电路硬件简单,成本低。缺点是每个主存块只有一个固定的行位置存放。如果块号相距m整数倍的两个块,要存于同一cache行时,就要发生冲突。此时, cache其它位置即使有空行也用不上。发生冲突时就要将原先已存入的块换出cache,但很可能过一段时间又要换入,频繁换入换出会使cache效率降低。直接映射cache适合于需要大容量cache的场合,更多的行数也可以减小冲突的机会
  3.组相联映射方式
  上述两种映射方式的优缺点正好相反。从存放位置的灵活性以及命中率来看,全相联映射方式要好;就比较电路简单以及硬件投资少来看,直接映射方式要优。若有一种方式能适度地兼有两者优点又尽量避免两者缺点就太好了,这个折衷方案就是组相联映射方式(Set-associative mapping)。

  这种方式是将cache分成u组,每组v行。主存块存放到哪个组是固定的,至于存放到该组哪个行是灵活的。即有如下关系:m = u × v,组号q j MOD u 块内存地址中,s位块号划分成三部分,高序的s-r bit为主存的组块号,中间的d bit 为主存组块的路号( v),低序的r- d位用于表示cache的组号,高、中序的s- r +d位作为标记(tag)与块数据一起存于此组的某行中。

  图232给出组相联cache的检索过程示意和映射关系。为了直观,图232中内存的排放采用与cache等容量的路内各组为一列,多路逐次排放的方式。于是处于同一水平位置的内存块可与多个处于同一水平位置的cache各路特定行建立映射关系,此时r -d位的物理地址既是cache的组号又是内存一列中的组号。d位是内存列的路号。注意:标记为地址最高的s-r +d位,因此内存块才可与同水平位置的Cache各路的特定行建立映射关系。
  在对标记按r -d位进行选组比较命中时,由命中行的组号与cache行的字号相加,找到该访问字,若是读操作,该字直接由此输出,若是写操作,直接修改该字(详见后续内容)。
  在对标记按r -d位进行选组比较未命中时,由物理地址直接寻址内存,找到该字,若是读操作,该字直接由此输出,同时将该字所在的内存块整体映射到与cache同一水平位置的各路无效行,若此时cache的各路没有无效行,要按某种算法找出同组各路中的一行,使它强行无效(置V=0)后添入该字所在的内存块,并将该块的标记填入cache该行的标记区。若是写操作,直接修改该字(详见后续内容)。
  当以一个给定内存地址检索组相联cache时,首先以此地址块号域的低r -d位找到cache相应组,然后将块号域的高s- r +d位与该组v行中的所有标记同时进行比较。哪行的标记与之相符,哪行即命中。然后再以内存地址的w位字域部分去检索此行的具体字,并完成所要求的存取操作。若此组没有一行的标记与之相符,即cache未命中,此时就要访问主存了。
  组相联映射方式中的每组路数v一般取值都较小。典型值是248,最大为16。这种规模的v路比较器较易设计与实现。而块在组中的排放又有一定的灵活性,使冲突减少。为强调比较器的规模和存放的灵活程度,常称之为v路组相联cache
  可证明前两种映射方式是组相联映射方式的两种极端情况。m= u×v ,若u=1全部cache行为一大组,即是全相联映射方式;若v1每组只一行,即是直接映射方式。由于组相联映射方式适度地兼顾了前两种方式的优点,故普遍被采用。

  二.替换策略

  当一个新的主存块要拷贝到cache,而允许存放此块的行位置都被其它主存块占满时,就要产生替换,因为cache 工作原理要求它应尽量保存最新的数据。替换问题与cache的组织方式紧密相关。对于采用直接映射方式的cache来说,因一个主存块只有一个特定的行位置可存放,所以问题解决很简单,把此特定行位置上的原主存块妥善处理后,换出Cache即可。对于全相联的cache来说,它的全部行都是可被替换的特定行,而组相联的cache中同组各路的行都是可被替换的特定行,这样就要从允许存放新主存块的若干特定行中选取一行换出。如何选取就涉及到替换策略或称替换算法的采用。以硬件实现的常用算法主要有以下三种。
  1.最不经常使用(LFU)算法
  LFU Least Frequenty Used)算法认为应将一段时间内被访次数最少的那行数据换出。为此,每行设置一个计数器,新行建立后从0开始计数,每访问一次被访行的计数器增1。当需要替换时,对这些特定行的计数值进行比较,将计数最小的行换出,同时将这些特定行的计数器都清零。将计数比较的期限定在,对这些特定行两次替换之间的间隔期间。 LFU算法的不足是这段期间访问情况不能严格反映近期访问情况。例如特定行中的甲、乙两行,甲行在期间的前期多次被访问而后期未被访问但累积计数值很大,乙行是前期不常用而后期却正被频繁访问,但可能由于累积计数小于甲行而被LFU算法换出了。
  2.近期最少使用(LRU)算法
  LRU Least Recent1y Used)算法是将近期内长久未被访问过的行换出。为此每 行也是设置一个计数器,但它们是cache每命中一次,命中行计数器清零,其它各行计数器增1,因此它是未访问次数计数器。当需要替换时,比较各特定行的计数值,将计数值最大的行换出。这种算法显然保护了刚拷贝进新数据的行,符合cache工作原理,因而使cache有较高的命中率。
  LRU算法硬件实现也不难。如果是两路组相联的cache,就更简单了。因为一个主存块只能在一个特定组的两行中来做替换选择,二选一完全不需要计数器,一组两行只需要一个二进制位即可。如规定一组中的A行拷贝进新数据将此位置1,另一行(B行)拷贝进新数据将此位置0。那么当需要替换时只需检查此乒乓位的状态即可,为0换出A行,为1换出B行,实现了保护新行的原则。后面将看到,Pentium片内的数据cache是一个两路组相联结构,采用的就是这种简捷的LRU替换策略。
  3.随机替换
  随机替换(Random Rep1acement)策略实际上是不要什么算法,从特定的行位置中随机地选取一行换出即可。这种策略以硬件实现最容易,而且速度也比前两种策略快。缺点是随意换出的数据很可能马上又要用,从而增加了映射次数,降低了命中率和cache 的工作效率。但这个缺点可以用增大cache的容量来克服,实验统计表明,随机替换策略的功效只是稍逊于前两种策略。

原创粉丝点击