高速缓冲存储器cache介绍

cache介绍

一、 Cache- 主存存储结构及其实现

     为了解决存储器系统的容量、存取速度及单位成本之间的矛盾,可以采用 Cache- 主存存储结构,即在主存和 CPU 之间设置高速缓冲存储器 Cache ,把正在执行的指令代码单元附近的一部分指令代码或数据从主存装入 Cache 中,供 CPU 在一段时间内使用,由于存储器访问的局部性,在一定容量 Cache 的条件下,我们可以做到使 CPU 大部分取指令代码及进行数据读写的操作都只要通过访问 Cache ,而不是访问主存而实现。

优点:

•  Cache 的读写速度几乎能够与 CPU 进行匹配,所以微机系统的存取速度可以大大提高;

•  Cache 的容量相对主存来说并不是太大,所以整个存储器系统的成本并没有上升很多。

采用了 Cache- 主存存储结构以后,整个存储器系统的容量及单位成本能够主存相当,而存取速度可以与 Cache 的读写速度相当,这就很好地解决了存储器系统的上述三个方面性能之间的矛盾。 


如图 4-21(P106) ,是 Cache- 主存结构示意图,在主存和 CPU 之间增加了一个容量相对较小的双极型静态 RAM 作为高速缓冲存储器 Cache ,为了实现 Cache 与主存之间的数据交换,系统中还相应地增加了辅助的硬件电路。

管理这两级存储器的部件为 Cache 控制器, CPU 与主存之间的数据传输必须经过

图 4-21 主存 -Cache 层次示意图 Cache 控制器 ( 见图 4-22 (P108)) 进行, Cache 控制器将来自 CPU 的数据读写请求,转向 Cache 存储器,如果数据在 Cache 中,则 CPU 对 Cache 进行读写操作,称为 一次命中 。命中时, CPU 从 Cache 中读 ( 写 ) 数据。由于 Cache 速度与 CPU 速度相匹配,因此不需要插入等待状态,故 CPU 处于零等待状态,也就是说也就是说 CPU 与 Cache 达到了同步,因此,有时称高速缓存为同步 Cache ;若数据不在 Cache 中,则 CPU 对主存操作,称为 一次失败 。失败时, CPU 必须在其总线周期中插入等待周期 T W 。


在主存— Cache 存储体系中,所有的程序代码和数据仍然都存放在主存中,

Cache 存储器只是在系统运行过程中,动态地存放了主存中的一部分程序块和

数据块的副本,这是一种以块为单位的存储方式。块的大小称为“块长”,块长一般取一个主存周期所能调出的信息长度。

假设主存的地址码为 n 位,则其共有 2 n 个单元,将主存分块 (block) ,每块有 B 个字节,则一共可以分成 2 n /B 块。 Cache 也由同样大小的块组成,由于其容量小,所以块的数目小得多,也就是说,主存中只有一小部分块的内容可存放在 Cache 中。

在 Cache 中,每一块外加有一个标记,指明它是主存中哪一块的副本,所

以该标记的内容相当于主存中块的编号。假定主存地址为 n = M + b 位,其中 M

称为主存的块地址,而 b 则称为主存的块内地址,即:主存的块数为 2 M ,块内

字节数为 2 b ;同样,假定 Cache 地址 n =N十 b 位,其中 N 称为 Cache 块地址,

而 b 为 Cache 的块内地址,即 Cache 的块数为 2 N ,块内字节数为 2 b ,通常使主

存与 Cache 的块内地址码数量相同,即 b = b ,即 Cache 的块内字节数与主存的

块内字节数相同。

当 CPU 发出读请求时,将主存地址M位 ( 或M位中的一部分 ) 与 Cache 某块的标记相比较,根据其比较结果是否相等而区分出两种情况:当比较结果相等时,说明需要的数据已在 Cache 中,那么直接访问 Cache 就行了,在 CPU 与 Cache 之间,通常一次传送一个字;当比较结果不相等时,说明需要的数据尚未调入 Cache ,那么就要把该数据所在的整个字块从主存一次调进来。


二、 Cache- 主存存储结构的命中率

     命中率指 CPU 所要访问的信息在 Cache 中的比率,相应地将所要访问的信息不在 Cache 中的比率称为失效率。

Cache 的命中率除了与 Cache 的容量有关外,还与地址映象的方式有关。

目前, Cache 存储器容量主要有 256KB 和 512KB 等。这些大容量的 Cache

存储器,使 CPU 访问 Cache 的命中率高达 90 %至 99 %,大大提高了 CPU 访问

数据的速度,提高了系统的性能。 


三、 两级 Cache- 主存存储结构

      CPU 内部的 Cache 与主机板上的 Cache 就形成两级 Cache 结构。

CPU 工作时,首先在第一级 Cache( 微处理器内的 Cache) 中查找数据,如果

找不到,则在第二级 Cache( 主机板上的 Cache) 中查找,若数据在第二级 Cache

中, Cache 控制器在传输据的同时,修改第一级 Cache ;如果数据既不在第一级

Cache 也不在第二级 Cache 中, Cache 控制器则从主存中获取数据,同时将数据

提供给 CPU 并修改两级 Cache 。两级 Cache 结构,提高了命中率,加快了处理

速度,使 CPU 对 Cache 的操作命中率高达 98 %以上。图 4-22 给出了主板上 Cache 存储器系统的基本结构。


三、 Cache 的基本操作

1 .读操作

     当 CPU 发出读操作命令时,要根据它产生的主存地址分两种情形:一种是

需要的数据已在 Cache 存储器中,那么只需直接访问 Cache 存储器,从对应单

元中读取信息到数据总线;另一种是所需要的数据尚未装入 Cache 存储器, CPU

在从主存读取信息的同时,由 Cache 替换部件把该地址所在的那块存储内容从

主存拷贝到 Cache 中。 Cache 存储器中保存的字块是主存相应字块的副本。

2 .写操作

     当CPU发出写操作命令时,也要根据它产生的主存地址分为两种情形:一种是不命中时,只向主存写入信息,不必同时把这个地址单元所在的整块内容调入Cache中;另一种是命中时,这时会遇到如何保持Cache与主存的一致性问题,通常有三种处理方式:  

  1.直写式(write through)即CPU在向Cache写入数据的同时,也把数据写入主存以保证Cache和主存中相应单元数据的一致性,其特点是简单可靠,但由于CPU每次更新时都要对主存写入,速度必然受影响。  
  2.缓写式(post write)即CPU在更新Cache时不直接更新主存中的数据,而是把更新的数据送入一个缓存器暂存,在适当的时候再把缓存器中的内容写入主存。在这种方式下,CPU不必等待主存写入而造成的时延,在一定程度上提高了速度,但由于缓存器只有有限的容量,只能锁存一次写入的数据,如果是连续写入,CPU仍需要等待。    
  3.回写式(write back)即CPU只向Cache写入,并用标记加以注明,直到Cache中被写过的块要被进入的信息块取代时,才一次写入主存。这种方式考虑到写入的往往是中间结果,每次写入主存速度慢而且不必要。其特点是速度快,避免了不必要的冗余写操作,但结构上较复杂。  


四、 地址映象及其方式

     我们知道,主存与 Cache 之间的信息交换,是以数据块的形式来进行的,

为了把信息从主存调入 Cache ,必须应用某种函数把主存块映象到 Cache 块,

称作地址映象。当信息按这种映象关系装入 Cache 后,系统在执行程序时,应

将主存地址变换为 Cache 地址,这个变换过程叫做地址变换(由于 Cache 的存储空间较小,因此, Cache 中的一个存储块要与主存中的若干个存储块相对应,即若干个主存块将映象到同一个 Cache 块)。

根据不同的地址对应方法,地址映象的方式通常有直接映象、全相联映象和组相联映象三种。

1 .直接映象

     每个主存块映象到 Cache 中的一个指定块的方式称为直接映象。在直接映象方式下,主存中某一特定存储块只可调入 Cache 中的一个指定位置,如果主存中另一个存储块也要调入该位置,则将发生冲突。

地址映象的方法 

将主存块地址对 Cache 的块号取模,即可得到 Cache 中的块地址,这相当于将主存的空间按 Cache 的大小进行分区,每区内相同的块号映象到 Cache 中相同

的块的位置。

一般来说,如果 Cache 被分成 2 N 块,主存被分成同样大小的 2 M 块, 则主存与 Cache 中块的对应关系如图 4-23 所示。

直接映象函数可定义为:

j = i mod 2 N

其中 j 是 Cache 中的块号; i 是主存中的块号。在这种映象方式中,主存的

第 0 块,第 2 N 块,第 2 N+l 块,…,只能映象到 Cache 的第 0 块,而主存的第 1

块,第 2 N 十 l 块,第 2 N+1 十 1 块,…,只能映象到 Cache 的第 1 块,依次类推。

例如,一个 Cache 的大小为 2K 字,每个块为 16 字,这样 Cache 中共有 128

个块。假设主存的容量是 256K 字,则共有 16384 个块。主存的地址码将有 18

位。在直接映象方式下,主存中的第 1 ~ 128 块映象到 Cache 中的第 1 ~ 128 块,

第 129 块则映象到 Cache 中的第 1 块,第 130 块映象到 Cache 中的第 2 块,依

次类推。

直接映象函数的优点是实现简单,缺点是不够灵活,尤其是当程序往返访问两个相互冲突的块中的数据时, Cache 的

命中率将急剧下降。


2 .全相联映象

     如图 4-24 所示,它允许主存中的每一个字块映象到 Cache 存储器的任何一个字块位置上,也允许从确实已被占满的 Cache 存储器中替换出任何一个旧字块当访问一个块中的数据时,块地址要与 Cache 块表中的所有地址标记进行比较以确定是否命中。在数据块调入时,存在着一个比较复杂的替换策略问题,即决定将数据块调入 Cache 中什么位置,将 Cache 中哪一块数据调出到主存。

全相联方法块冲突的概率低, Cache 的利用率高,是一种最理想的解决方案,但全相联 Cache 中块表查找的速度慢,由于 Cache 的速度要求高,因此全部比较和替换策略都要用硬件实现,控制复杂,实现起来也比较困难。


3 .组相联映象

     组相联映象方式是全相联映象和直接映象的一种折衷方案。这种方法将存

储空间分成若干组,各组之间是直接映象,而组内各块之间则是全相联映象。

如图 4-25 所示,在组相联映象方式下,主存中存储块的数据可调入 Cache 中一

个指定组内的任意块中。它是上述两种映象方式的一般形式,如果组的大小为

1 时就变成了直接映象;如果组的大小为整个 Cache 的大小时就变成了全相联

映象。


例如,把 Cache 子块分成 2 C 组,每组包含 2 R 个字块,那么,主存字块 M M (i)(0 ≤ i ≤ 2 M -1) 可以用下列映象函数映象到 Cache 字块 MN(j)( 0 ≤ j ≤ 2 N -1) 上:

j = (i mod 2 C ) × 2 R 十 k ( 0 ≤ k ≤ 2 R -1)

例如, 设 C = 3 位, R = 1 位,考虑

主存字块 15 可映象到 Cache 的哪一个字块中。根据公式,可得:

j = (i mod 2 C ) × 2 R 十 k

= (15 mod 2 3 ) × 2 1 十 k

= 7 × 2 十 k

= 14 十 k

又: 0 ≤ k ≤ 2 R -1 = 2 1 - 1 = 1

即: k = 0 或 1

代入后得 j = 14(k = 0) 或 15(k = 1) 。所以主存模块 15 可映象到 Cache 字块 14

或 15 ,在第 7 组。同样可计算出主存字块 17 可映象到 Cache 的第 0 块或第 1

块 , 在第 1 组。

组相联映象方法在判断块命中以及替换算法上都要比全相联映象方法简

单,块冲突的概率比直接映象方法的低,其命中率介于直接映象和全相联映象

方法之间。


五、 替换策略

     主存与 Cache 之间的信息交换,是以存储块的形式来进行的,主存的块长与 Cache 的块长相同,但由于 Cache 的存储空间较小,主存的存储空间较大,因此, Cache 中的一个存储块要与主存中的若干个存储块相对应,若在调入主存中一个存储块时, Cache 中相应的位置已被其它存储块占有,则必须去掉—个旧的字块,让位于一个新的字块。这称为替换策略或替换算法。

常用的两种替换策略是:先进先出 (FIFO) 策略和近期最少使用 (LRU) 策

略。

1 .先进先出 (FIFO) 策略

    FIFO ( First In First Out )策略总是把一组中最先调入 Cache 存储器的字块替换出去,它不需要随时记录各个字块的使用情况,所以实现容易,开销小。

2 .近期最少使用 (LRU) 策略

    LRU(Least Recently Used) 策略是把一组中近期最少使用的字块替换出去,

这种替换策略需随时记录 Cache 存储器中各个字块的使用情况,以便确定哪个

字块是近期最少使用的字块。 LRU 替换策略的平均命中率比 FIFO 要高,并且

当分组容量加大时,能提高该替换策略的命中率。


LRU 实现方法是:把组中各块的使用情况

记录在一张表上 ( 如图 4-26 所示 ) ,并把最近使用过的块放在表的最上面,设组

内有 8 个信息块,其地址编号为 0 , 1 ,…, 7 。当要求替换时,首先更新 7 号信息块的内容;如要访问 7 号信息块,则将 7 写到表的顶部,其它号向下顺移。接着访问 5 号信息块,如果此时命中,不需要替换,也要将 5 移到表的顶部,其它号向下顺移。 6 号数据块是以后要首先被替换的,……。

LRU 策略的另一种实现方法是:对 Cache 存储器中的每一个字块都附设一

个计数器,记录其被使用的情况。每当 Cache 中的一块信息被命中时,比命中

块计数值低的信息块的计数器均加 1 ,而命中块的计数器则清 0 。显然,采用这

种计数方法,各信息块的计数值总是不相同的。一旦不命中的情况发生时,新

信息块就要从主存调入 Cache 存储器,以替换计数值最大的那片存储区。这时,

新信息块的计数值为 0 ,而其余信息块的计数值均加 1 ,从而保证了那些活跃的

信息块(即经常被命中或最近被命中的信息块)的计数值要小,而近来越不活

跃的信息块的计数值越大。这样,系统就可以根据信息块的计数值来决定先替

换谁。


六、 P III 中采用的 Cache 技术

     在本节的开头曾提到,为了提高 CPU 访问存储器的速度,在 486 和 Pentium

机中都设计了一定容量的数据 Cache 和指令 Cache ( L1 ) , 并且还可以使用处理

器外部的第二级 Cache ( L2 )。 Pentium Pro 在片内第一级 Cache 的设计方案中,

也分别设置了指令 Cache 与数据 Cache 。指令 Cache 的容量为 8kB ,采用 2 路

组相联映像方式。数据 Cache 的容量也为 8kB ,但采用 4 路组相联映像方式。

它采用了内嵌式或称捆绑式 L2 Cache ,大小为 256kB 或 512kB 。此时的 L2 已

经用线路直接连到 CPU 上,益处之一就是减少了对急剧增多 L1 Cache 的需求。

L2 Cache 还能与 CPU 同步运行,即当 L1 Cache 不命中时,立刻访问 L2 Cache ,

不产生附加延迟。

     Pentium II 是 Pentium Pro 的改进型,同样有 2 级 Cache , L1 为 32kB( 指令和

数据 Cache 各 16kB) 是 Pentium Pro 的两倍, L2 为 512kB 。 Pentium II 与 Pentium

Pro 在 L2 Cache 的不同是由于制作成本的原因。此时, L2 Cache 已不在内嵌芯

片上,而是与 CPU 通过专用 64 位高速缓存总线相联,与其它元器件共同被组

装在同一基板上,即 “ 单边接触盒 ” 上。

Pentium III 也是基于 Pentium Pro 结构为核心,它具有 32kB 非锁定 L1 Cache

和 512kB 非锁定 L2 Cache 。 L2 可扩充到 1 ~ 2MB ,具有更合理的内存管理,可

以有效地对大于 L2 缓存的数据块进行处理,使 CPU 、 Cache 和主存存取更趋合

理,提高了系统整体性能。在执行视频回放和访问大型数据库时,高效率的高

速缓存管理使 P III 避免了对 L2 Cache 的不必要的存取。由于消除了缓冲失败,

多媒体和其它对时间敏感的操作性能更高了。对于可缓存的内容, P III 通过预先

读取期望的数据到高速缓存里来提高速度,这一特色提高了高速缓存的命中率,

减少了存取时间。

     为进一步发挥 Cache 的作用,改进内存性能并使之与 CPU 发展同步来维护

系统平衡,一些制造 CPU 的厂家增加了控制缓存的指令。 Intel 公司也在 Pentium III 处理器中新增加了 70 条 3D 及多媒体的 SSE 指令集,其中有很重要

的一组指令是缓存控制指令。 AMD 公司在 K6-2 和 K6-3 中的 3DNow 多媒体指

令中,也有从 L1 数据 Cache 中预取最新数据的数据预取指令 (Prefetch) 。

Pentium III 处理器有两类缓存控制指令。一类是数据据预存取 (Prefetch) 指

令,能够增加从主存到缓存的数据流;另一类是内存流优化处理 (Memory

Streaming) 指令,能够增加从处理器到主存的数据流。这两类指令都赋予了应用

开发人员对缓存内容更大的控制能力,使他们能够控制缓存操作以满足其应用

的需求,同时也提高了 Cache 的效率。


  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值