手机爱奇艺无法全屏:高速缓冲存储器

来源:百度文库 编辑:中财网 时间:2024/04/29 08:54:55

3.7 高速缓冲存储器

  高速缓冲存储器的功能是提高CPU数据输入/输出的速率,突破所谓的存储器瓶颈问题,即CPU与存储系统间数据传送带宽限制。高速缓冲存储器能以极高的速率进行数据的访问,但因其价格高昂,所以只在CPU和主存之间添加少量的Cache,利用程序的局部性原理来进行工作。

3.7.1 程序访问的局部性原理

  程序访问的局部性有两个方面的含义:时间局部性和空间局部性。时间局部性是指最近的访问项(指令/数据)很可能在不久的将来再次被访问(往往会引起对最近使用区域的集中访问),而空间局部性是指一个进程访问的各项地址彼此很近。
  换句话说,就是最近的、未来要用的指令和数据大多局限于正在用的指令和数据,或是存放在与这些指令和数据位置上邻近的单元中。这样,就可以把目前常用或将要用到的信息预先放在存取速度最快的存储器中,从而使CPU的访问速度大大提高。
  依据局部性原理,把主存储器中访问概率高的内容存放在Cache中,当CPU需要读取数据时,首先在Cache中查找是否有所需内容,如果有则直接从Cache中读取;若没有再从主存中读取该数据,然后同时送往Cache和CPU。如果CPU需要访问的内容大多都能在Cache中找到(称为命中),则可以大大提高系统性能。

3.7.2 Cache的基本工作原理

  如图3-13所示给出了Cache的基本结构。Cache和主存都被分成若干个大小相等的块,每块由若干字节组成。由于Cache的容量远小于主存的容量,所以Cache的块数要远少于主存的块数,它保存的信息只是主存中最活跃的若干块的副本。用主存地址的块号字段访问Cache标记,并将取出的标记和主存地址的标记字段相比较,若相等,说明访问Cache有效,称Cache命中,若不相等,说明访问Cache无效,称Cache不命中或失效,而此时需要从主存中将该块取出至Cache中。

  当CPU发出读请求时,如果Cache命中,就直接对Cache进行读操作,与主存无关;如果Cache不命中,则仍需访问主存,并把该块信息一次从主存调入Cache内。若此时Cache已满,则须根据某种替换算法,用这个块替换掉Cache中原来的某块信息。
  当CPU发出写请求时,如果Cache命中,有可能会遇到Cache与主存中的内容不一致的问题,处理的方法主要有两种,一是同时写入Cache和主存,称为写直达法;二是将信息暂时只写入Cache,并用标志将该块加以注明,直到该块从Cache中替换出来时才一次写入主存,称为写回法。如果不命中,就直接把信息写入主存,而与Cache无关。

3.7.3 Cache和主存之间的映像方式

  为了把信息放到Cache中,必须应用某种函数把主存地址映像到Cache中定位,称为地址映像(映射)。而将主存地址变换成Cache地址,称做地址变换,它们之间是密切相关的。常用的地址映像方式有三种,分别是全相联映像、直接映像和组相联映像。
  1.全相联映像
  全相联映像是指将内存和Cache按照固定的相同的大小进行分块。内存的块和Cache的块可以任意对应,即内存的任何一块都可以映像到Cache的任何一块。在Cache的存储空间被占满的情况下,也允许确实已被占满的Cache存储器中替换出任何一个旧块,具体如图3-14所示。
  2.直接映像
  直接映像先将Cache分成若干块,每个块的大小相同,并对每个块进行编号。同时根据Cache容量大小将内存分成若干区(页),每个区的容量都跟Cache的容量相同,然后对内存进行分块,每块的大小跟Cache块的大小相同,同样对区内的块进行编号。映像时,内存的某个区的块只能保存在与其块号相同的Cache块中。如图3-15所示,内存各区中的第0块只能映像到Cache的第0块,而不能映像到其他块。

  3.组相联映像
  组相联映像实际上是直接映像和全相联映像的折中方案。组相联映像方式先将Cache分成大小相同的若干区(组),对每个区按照直接映像的方式进行分块,并且编号,因此,Cache中有多个编号相同的块。对内存按照Cache区的大小进行分页,再对每页按照Cache块的大小进行分块,每个内存块可以对应不同Cache区中的相同块号的块。如图3-16中内存第0页的第0块,可以对应Cache的第0区的第0块,也可以对应第j区的第0块。
  在三种方式中,全相联映像方式比较灵活,Cache的块冲突概率最低、空间利用率最高,但是地址变换速度慢,而且成本高,实现起来比较困难;直接映像方式是最简单的地址映像方式,成本低,易实现,地址变换速度快,而且不涉及其他两种映像方式中的替换算法问题。但这种方式不够灵活,Cache的块冲突概率最高、空间利用率最低;组相联映像实际上是全相联映像和直接映像的折中方案,其优点和缺点介于全相联和直接映像方式的优缺点之间。

3.7.4 Cache中主存块的替换算法

  当采用全相联映像和组相联映像方式从主存向Cache传送一个新块,而Cache中的可用位置已经占满时,就产生了替换算法的问题。目前,常用的替换算法主要有以下几种。
  1.随机替换算法
  随机替换算法的思想最简单,即随机地选择一个Cache块进行替换,它不考虑Cache块过去、现在及将来的使用情况。
  2.先进先出算法
  先进先出(First Input First Output,FIFO)算法的思想是:按调入Cache的先后决定淘汰的顺序,即在需要更新时,将最先进入Cache的块作为被替换的块。这种方法不需要随时记录各个块的使用情况,容易实现,而且系统开销小。其缺点是可能会把一些需要经常使用的程序块(如循环程序)也作为最早进入Cache的块替换掉。
  3.近期最少使用算法
  最近最少使用(Least Recently Used,LRU)算法是把CPU近期最少使用的块作为被替换的块。这种替换方法需要随时记录Cache中各块的使用情况,以便确定哪个块是近期最少使用的块。LRU算法相对合理,但实现起来比较复杂,系统开销较大。通常需要对每一块设置一个称为计数器的硬件或软件模块,用以记录其被使用的情况。
  无论FIFO算法还是LRU算法,都不能确定调出去的块近期将绝不会再被使用。研究表明,采用这两种算法后可使Cache的命中率达到90%左右,其中LRU算法略优于FIFO算法,这在实际使用中已经是很不错的了。

3.7.5 Cache写策略

  CPU对Cache的写入更改了Cache的内容。可选用写操作策略使Cache内容和主存内容保持一致。Cache写的策略主要有以下几种。
  1.写回法
  当CPU写Cache命中时,只修改Cache的内容,而不立即写入主存。只有当该块被换出时才写回主存。这种方法减少了访问主存的次数,但是存在不一致性的隐患。实现这种方法时,每个Cache块必须配置一个修改位,以反映此块是否被CPU修改过。这种方法的优点是操作速度快,缺点是因主存中的字块未随时修改而有可能出错。
  2.写全法
  也称为写直达法。当写Cache命中时,Cache与主存同时发生写修改,因而较好地维护了Cache与主存的内容的一致性;当写Cache未命中时,直接向主存进行写入。Cache中每块无须设置一个修改位及相应的判断逻辑。缺点是降低了Cache的功效。
  3.写一次法
  写一次法是基于写回法并结合了写全法的写策略,写命中与写未命中的处理方法与写回法基本相同,只是第一次写命中时要同时写入主存。这便于维护系统全部Cache的一致性。

3.7.6 Cache的性能

  增加Cache的目的,就是在性能上使主存的平均读出时间尽可能接近Cache的读出时间,因此,Cache的命中率应接近于1。由于程序访问的局部性,这是可能的。在一个程序执行期间,设Nc表示Cache完成存取的总次数,Nm表示主存完成存取的总次数,h为命中率,则有:

  若tc表示命中时的Cache访问时间,tm表示未命中时的主存访问时间,则Cache/主存系统的平均访问时间ta为:

  设r=tm/tc,表示主存慢于Cache的倍率,e表示访问效率,则有:

  为提高访问效率,命中率h越接近1越好,r值以5~10为宜,不宜太大。命中率h与程序的行为、Cache的容量、组织方式、块的大小有关。