• 沒有找到結果。

4.6.1 程序访问的局部性

据统计 CPU 的速度平均每年改进 60%,而组成主存的动态 RAM 速度平均每年只改进 7%,

结果是 CPU 和动态 RAM 之间的速度间隔平均每年增大 50%。为了解决 CPU 和主存之间速度 不匹配的问题,可以考虑在 CPU 和主存之间设置一个高速的容量相对较小的存储器,称为高 速缓冲存储器(Cache)。

通过大量典型程序的分析,可以发现 CPU 从主存取指令或取数据,在一定时间内,只是 对主存局部地址区域的访问。这是由于指令和数据在主存内都是连续存放的,并且有些指令和 数据往往会被多次调用(如子程序、循环程序和一些常数)。这种一定时间内对局部范围的存 储器地址频繁访问,而对此范围以外的地址则访问甚少的现象就称为程序访问的局部性。

根据这一原理,很容易设想,只要将 CPU 近期要用到的程序和数据,提前从主存送到 Cache,那么就可以做到 CPU 在一定的时间内不必从主存储器取指令和数据,而只需要访问 Cache,从而提高访问速度。一般 Cache 采用高速的 SRAM 制作,其价格比主存贵,但因其容 量远小于主存,因此能很好地解决速度和成本的矛盾。

为了尽量提高 Cache 存储器的速度,它的全部功能由硬件实现,并且对程序员是透明的。

4.6.2 Cache 的基本工作原理 1.Cache 的基本结构

图 4-36 表示 Cache 的基本结构。它一般由两部分组成,一部分存放由主存储器来的数据,

另一部分存放该数据在主存储器时的存放地址(此部分称为地址标记存储器,记为 Tag)。

图 4-36 Cache 的基本结构

设主存有 2n个字节,每个字节的地址码为 n 位,为了与 Cache 映射,将主存与缓存都分 成若干大小相同的块,每个块内又包含若干个字节。设块内有 B 个字节,则主存共分成 M=2n

/B 块,这就将主存的 n 位地址分成两段:高 m 位表示主存的块地址,低 b(B=2b)位表示块 Cache 块,所以映射的功能决定了 Cache 的结构。通常,Cache 的映射采用三种技术:直接映 像、全相联映像和组相联映像。在 4.6.3 节中将详细讨论这三种映像方法。

(4)替换算法:当新的主存块需要被调入 Cache 时,如果它的可用空间被占满的话,Cache 中原存储的块需要被替换掉。如果新装入块的可用空间不只一个,就需要一种替换算法决定先

(6)Cache 数目。Cache 刚刚出现时,通常系统只有一个 Cache,近年来普遍采用多个 Cache。这个增多有两个方面,一个是增加 Cache 的级数,一个是将统一的 Cache 分成分立的 Cache。

1)一级缓存和二级缓存。当芯片集成度提高后,可以将 Cache 直接和处理器制作在同一 个芯片内,这也叫片内缓存。与通过外部总线连接的 Cache 相比,片内 Cache 使得 CPU 访问

Cache 时不必占用芯片之外的总线,并且片内 Cache 与 CPU 之间的数据通路更短,大大提高

到充分利用,并降低了命中率。

图 4-37 直接映像 Cache 组织 2.全相联映像

全相联映像方式是最灵活但成本最高的一种方式,如图 4-38 所示。它允许主存中的每一 个字块映像到 Cache 存储器的任何一个字块位置上,也允许从确实已被占满的 Cache 存储器中 替换出任何一个旧字块。这是一个理想的方案。实际上由于它的成本太高而不能采用。不只是 它的标记位数从 t 位增加到 t+c 位(与直接映像相比)使 Cache 标记容量加大,主要问题是在 访问 Cache 时,需要和 Cache 的全部块标记进行比较才能判断出所访问的主存地址的内容是否 已在 Cache 中。由于 Cache 速度要求很高,所以全部比较操作都要用硬件实现,通常由“按内 容寻址”的相联存储器完成。所需逻辑电路甚多,以致无法用于 Cache 中。

图 4-38 全相联映像 Cache 组织 3.组相联映像

组相联映像方式是直接映像和全相联映像方式的一种折中方案。组相联映像 Cache 组织 如图 4-39 所示。它把 Cache 字块分为 2c`组,每组包含 2r个字块,于是有 c=c′+r。那么主存字

块 Mm(i)(0≤i≤2m-1)可以用下列映像函数映像到 Cache 字块 Mc(j)(0≤j≤2c-1)上。

j=(i mod 2c′)×2r+k (0≤k≤2r-1)

按这种映像关系,组间为直接映像,而组内的字块为全相联映像方式。

组相联映像把地址分成 3 段,末 b 位为块内地址,中间 c′位为 Cache 组地址,高 t 位(区 地址)和 r 位(组内块地址)形成标记字段。

图 4-39 组相联映像 Cache 组织

在实际 Cache 中用得最多的是直接映像(r=0)、两路组相联映像(r=1)和 4 路组相联映 像(r=2)。如 r=2,计算得 0≤k≤3,所以主存某一字块可映像到 Cache 某组 4 个字块的任一 字块中,这大大地增加了映像的灵活性,提高了命中率。

根据主存地址的“Cache 组地址”字段访问 Cache,并将主存字块标记(t 位+r 位)与 Cache 同一组的 2r个字块标记同时进行比较,并检查有效位,以确定是否命中。当 r 不大时,需要同 时进行比较的标记数不大,这个方案还是比较现实的。

组相联映像方式的性能与复杂性介于直接映像与全相联映像两种方式之间。当 r=0 时,它 就成为直接映像方式;当 r=c 时,就是全相联映像方式。

4.6.4 Cache 的替换算法与写策略 1.Cache 中主存块的替换算法

在从主存读出新的字块调入 Cache 存储器时,如果遇到 Cache 存储器中相应的位置已被 其他字块占有,那么就必须去掉一个旧的字块,让位于一个新的字块。这种替换应该遵循一定 的规则,最好能使被替换的字块是下一段时间内估计最少使用的。这些规则称为替换策略或替 换算法,由替换部件加以实现。常用的替换算法有以下几种:

(1)随机替换算法。这种替换的原则是需要替换 Cache 块时,用随机数发生器产生需替 换掉的 Cache 块号。由于这种算法没有考虑到信息的历史情况和使用情况,所以在性能上比根 据使用情况的替换算法要差些,实际很少使用。

(2)先进先出(FIFO)算法。FIFO 算法的原则是每次需要替换块的时候,将最先装入 Cache 中的块替换掉。FIFO 用循环或环形缓冲技术很容易实现,不需要随时记录各字块的使

用情况。但其缺点是可能将一些经常被用到的程序作为最早装入的块替换掉。

(4)最不经常使用(LFU)算法。LFU 算法的原则是替换掉 Cache 中引用次数最少的块。

为了确定使用次数最少的 Cache 块,每个块都使用一个相关的计数器,Cache 块每引用一次,

图 4-40 Pentium 处理器框图

从图中可以看到,Pentium 的核心执行单元为两个可以并行执行的整型算术逻辑单元和 它自己的寄存器,还有加、乘、除运算部件的浮点单元,而突出的结构为两个 Cache 的布局 结构。其中数据 Cache 用于提供数据给整数和浮点数操作,它有两个 32 位的端口,分别与 两个整型 ALU 相连,也可以合在一起与 64 位浮点单元相连。因此,数据 Cache 可以直接支 持整型 ALU 和浮点操作。而另一个指令 Cache 为只读存储器,从它读出代码,然后直接送 到预取指令缓冲区。

Pentium 的数据 Cache 由 128 个组组成,每个组组内有两个块,在逻辑上可以形成两个 4K 字节的“路”,在 Cache 中与每块相关的是标记和两个状态位,这在逻辑上也可以组织成两个 目录。所以在 Cache 中每个块都有一个目录项。主存地址的 32 位中,高 20 位为标记,中间 7 位为组号,最低 5 位为块内地址。

Cache 控制器采用的替换算法是近期最少使用(LRU)算法,所以每组设置有一个 LRU 状态位相关每组中的两个块,表示块的使用情况。

数据 Cache 采用的写策略为回写策略,只有当 Cache 中数据被修改过的块要被替换掉时,

才将相应的信息写回主存储器。同时,Pentium 处理器能够动态配置以支持 Cache 的写通过策 略。在 Cache 数目方面,Pentium 处理器支持外部的 2 级 Cache,容量为 256K 字节或 512 字 节,而 Cache 中每块的大小可为 32、64 或 128 字节,外部 Cache 的结构为二路组相联结构。

在保持数据 Cache 一致性方面,数据 Cache 支持 MESI 协议。

相關文件