简述影响 Cache 命中率的因素
摘要: 存储器是计算机的核心部件之一。由于 CPU 和主存在速度上的存在着巨大差 异, 现代计算机都在 CPU 和主存之间设置一个高速、 小容量的缓冲存储器 cache。 Cache 最重要的技术指标是它的命中率。
本文简单讨论了影响 Cache 命中率的几 个因素。
关键字:cache 容量,块大小,替换算法,映射方式。
一、引言 在计算机技术发展过程中,主存储器存取速度一直比中央处理器操作速度慢 得多, 使中央处理器的高速处理能力不能充分发挥,整个计算机系统的工作效率 受到影响。有很多方法可用来缓和中央处理器和主存储器之间速度不匹配的矛 盾,如采用多个通用寄存器、多存储体交叉存取等,在存储层次上采用高速缓冲 存储器也是常用的方法之一。很多大、中型计算机以及新近的一些小型机、微型 机也都采用高速缓冲存储器。 高速缓冲存储器的容量一般只有主存储器的几百分之一,但它的存取速度能 与中央处理器相匹配。 根据程序局部性原理,正在使用的主存储器某一单元邻近 的那些单元将被用到的可能性很大。因而,当中央处理器存取主存储器某一单元 时, 计算机硬件就自动地将包括该单元在内的那一组单元内容调入高速缓冲存储 器, 中央处理器即将存取的主存储器单元很可能就在刚刚调入到高速缓冲存储器 的那一组单元内。于是,中央处理器就可以直接对高速缓冲存储器进行存取。在 整个处理过程中, 如果中央处理器绝大多数存取主存储器的操作能为存取高速缓 冲存储器所代替, 计算机系统处理速度就能显著提高。 高速缓冲存储器最重要的 技术指标是它的命中率。
二、简述影响 cache 命中率的因素
1、Cache 容量对命中率的影响 Cache 的命中率随它的容量的增加而提高,它们之间的关系曲线如图所示。在 Cache 容 量比较小的时候,命中率提高得非常快,但根据边际效应递减原理随着 Cache 容量的增加, 命中率提高的速度逐渐降低。当 Cache 的容量增加到无穷大时,命中率可望达到 100%,但 是这在实际是做不到的。 在一般情况下,图中的关系曲线可以近似地表示为 H=1-S-0.5。因此,当 Cache 的容量 达到一定值之后,再增加 Cache 容量,命中率的提高很少。 Cache 命中率 H 与容量 S 的关系
2、Cache 块大小对命中率的影响 当 Cache 的容量一定时, 在采用组相联映象和变换方式的 Cache 中, 块的大小对命中率 的影响非常敏感。我们可以从下面的 Cache 映象逻辑表达式分析: 设 Cache 的总量为 S,组数为 M,组内块数为 N,块大小为 A。所以,有: S = M*N*A 由上式可知,在 Cache 的容量 S 和 Cache 组内块数 N(也可换成是组数 M)固定不变时, Cache 块大小与组数成反比。 因此,当 Cache 的块容量很小,组的数目就多,主存中的某一块可以映象到 Cache 中的 块数就少,所以此时,Cache 的命中率低。 随着块大小的增加, 由于程序的空间局部性起主要作用, 同一块中数据的利用率比较高。 因此,Cache 的命中率开始升高。但如果块变得过大的话,会减少装入 Cache 的总行数, 而且,也会使得离所访问的位置较远的块被再次使用的概率变小。因此,这种增加趋势在某 一个“最佳块大小”处使 Cache 命中率达到最大值。在这一点以后,命中率随着块大小的 增加反而减小。因为实际上,当块的容量变得比较大时(此时还是在组相联映象中,并没有 蜕变成全相联映象),进入 Cache 中的许多数据可能根本用不上。而且,随着块大小的增 加,程序时间局部性的作用就会逐渐减弱。最后,当块大小等于整个 Cache 的容量时(此 时主存块应该是按成组的方式被调入 Cache),命中率将趋近于零。 所以,根据 Cache 块的容量由小到大的变化
(1) 对于给定的 Cache 容量,当块大小增加时,命中率开始时处于上升趋势,后来反而 会下降。
(2) Cache 容量越大,会使命中率达到最高的拐点的块大小增大。 在这里, 导致命中率先上升后下降的原因在于增加块大小产生双重作用。 一方面会减少 强制性失效,因为程序局部性原理,增加块大小增加了利用空间局部性的机会;另一方面, 在容量一定情况下, 增加块大小会减少总的块数目, 会增加冲突失效, 在 Cache 容量较小时, 还可能增加容量失效。刚开始增加块大小时,由于块大小还不是很大,上述第一种作用超过 第二种作用,使命中率上升。当块大小增加到一定程度时,第二种作用会超过第一种作用, 使命中率下降。 综上所述,块的大小对 Cache 命中率的影响是显而易见的;而 Cache 命中率对整个 Cache 存储系统的存取效率的影响又是至关重要的。所以,对于系统体系结构的设计人员, 甚至是软件开发人员来说,关于块大小的最佳选择都是值得研究的。
3、Cache 中与主存映射方式对命中率的影响
3-1.全相联方式 地址映象规则:主存的任意一块可以映象到 Cache 中的任意一块 (1) 主存与缓存分成相同大小的数据块。 (2) 主存的某一数据块可以装入缓存的任意一块空间中。 全相联方式的对应关系如图所示。如果 Cache 的块数为 Cb,主存的块数为 Mb,则映象关系 共有 Cb×Mb 种。 应用全相联的方式命中率比较高,Cache 存储空间利用率高。但是访问相关存储器时,每次 都要与全部内容比较,速度低,成本高,因而应用少。
3-2.直接相联方式 地址映象规则: 主存储器中一块只能映象到 Cache 的一个特定的块中。 (1) 主存与缓存分成相同大小的数据块。 (2) 主存容量应是缓存容量的整数倍,将主存空间按缓存的容量分成区,主存中每 一区的块数与缓存的总块数相等。 (3) 主存中某区的一块存入缓存时只能存入缓存中块号相同的位置。 图示出了直接相联映象规则。 可见,主存中各区内相同块号的数据块都可以分别调入 缓存中块号相同的地址中,但同时只能有一个区的块存入缓存。由于主、缓存块号相同,因 此,目录登记时,只记录调入块的区号即可。 应用直接相联的方式地址映象方式简单,数据访问时,只需检查区号是否相等即可,因 而可以得到比较快的访问速度,硬件设备简单。 但是使得替换操作频繁,命中率比较低。
3-3.组相联映象方式 组相联的映象规则: (1) 主存和 Cache 按同样大小划分成块。 (2) 主存和 Cache 按同样大小划分成组。 (3) 主存容量是缓存容量的整数倍,将主存空间按缓冲区的大小分成区,主存 中每一区的组数与缓存的组数相同。 (4) 当主存的数据调入缓存时,主存与缓存的组号应相等,也就是各区中的某 一块只能存入缓存的同组号的空间内,但组内各块地址之间则可以任意存放, 即 从主存的组到 Cache 的组之间采用直接映象方式; 在两个对应的组内部采用全相联 映象方式。 应用组相联的方式块的冲突概率比较低,块的利用率大幅度提高,块失效率明显降低。 但是实现难度和造价要比直接映象方式高。
4、Cache 的替换算法对命中率的影响 当新的主存块需要调入 Cache 并且它的可用空间位置又被占满时,需要替换掉 Cache 的数据,这就产生了替换策略(算法)问题。根据程序局部性规律可知:程序在运行中,总 是频繁地使用那些最近被使用过的指令和数据。这就提供了替换策略的理论依据。 替换算法目标就是使 Cache 获得最高的命中率。Cache 替换算法是影响代理缓存系统性 能的一个重要因素,一个好的 Cache 替换算法可以产生较高的命中率。
常用算法如下:
(1)随机法(RAND 法) 随机替换算法就是用随机数发生器产生一个要替换的块号, 将该块替换出去, 此算法简 单、易于实现,而且它不考虑 Cache 块过去、现在及将来的使用情况,但是没有利用上层存 储器使用的“历史信息”、没有根据访存的局部性原理,故不能提高 Cache 的命中率,命中 率较低。
(2)先进先出法(FIFO 法) 先进先出(First-In-First-Out,FIFO)算法。就是将最先进入 Cache 的信息块替换出 去。FIFO 算法按调入 Cache 的先后决定淘汰的顺序,选择最早调入 Cache 的字块进行替换, 它不需要记录各字块的使用情况,比较容易实现,系统开销小,其缺点是可能会把一些需要 经常使用的程序块(如循环程序)也作为最早进入 Cache 的块替换掉,而且没有根据访存的 局部性原理,故不能提高 Cache 的命中率。因为最早调入的信息可能以后还要用到,或者经 常要用到,如循环程序。此法简单、方便,利用了主存的“历史信息”, 但并不能说最先 进入的就不经常使用,其缺点是不能正确反映程序局部性原理,命中率不高,可能出现一种 异常现象。
(3)近期最少使用法(LRU 法) 近期最少使用 (Least Recently Used, LRU) 算法。 这种方法是将近期最少使用的 Cache 中的信息块替换出去。 该算法较先进先出算法要好一些。 但此法也不能保证过去不常用将来 也不常用。 LRU 法是依据各块使用的情况,总是选择那个最近最少使用的块被替换。这种方法虽然 比较好地反映了程序局部性规律,但是这种替换方法需要随时记录 Cache 中各块的使用情 况,以便确定哪个块是近期最少使用的块。LRU 算法相对合理,但实现起来比较复杂,系统 开销较大。 通常需要对每一块设置一个称为计数器的硬件或软件模块,用以记录其被使用的 情况。
结论: 在 Cache 容量较小的情况下,随机策略相对较好,而随着 Cache 容量的增加,最近最少 使用(LRU)和先进先出(FIFO)策略的效果较好。所以一般的计算机默认的采用 LRU 替换策 略。 由于主存中的块比 Cache 中的要多, 所以当要从主存调入一个块到 Cache 中时, 会出现 该快所映像到的一组 Cache 块已被占用的情况。这是需要强制其中的一块移出 Cache,以接 纳新的 Cache 块。这就需要替换策略选择替换的块。 替换策略主要是在对 Cache 块进行淘汰时, 如何选择要替换的块的策略。 目前主要又三 种替换策略:最近最少使用(LRU)策略、先进先出(FIFO)策略、随机(RANDOM)策略。这三种 替换策略各有优劣。 好的替换策略会将使用率高的 Cache 块更长时间的驻留在 Cache 中, 从 而降低 Cache 失效率,提高 Cache 性能。