高速缓存工作原理

        如果您买过 计算机,那么您肯定听说过“ 缓存”这个词。现代计算机都有L1和L2缓存,许多计算机现在还有L3缓存。可能还有热心朋友在缓存方面给您出过主意,像“别买赛扬的芯片,它里面没有任何缓存!”。

       事实表明,高速缓存是计算机科学所采用的一种重要方法,它以各种不同的形式存在于每台计算机上。缓存分为内存缓存、硬件和软件磁盘缓存、页缓存等等。甚至虚拟内存也是一种高速缓存形式。在本文中,我们将探究高速缓存的原理,以让您明白它为何如此重要。

      高速缓存是一项基于计算机存储器子系统的技术。使用缓存的主要目的是在提高计算机速度的同时,保持计算机的较低价格。采用高速缓存,您可以在计算机上更快地完成各种任务。

       为了了解缓存系统的基本概念,让我们先通过一个超级简单的图书管理员的例子来说明高速缓存的概念。想像一下,有一位图书管理员坐在桌子的后面。他的工作就是为您找出您要借阅的书。为简单起见,我们假定您自己不能取书,而必须让图书管理员帮您取来所要借阅的书。于是他会从库房的藏书架上为您取出这本书(华盛顿特区的国会图书馆就采用这种方式)。我们首先从不带缓存的图书管理员开始。

       第一位顾客来了。他要借阅《白鲸》。图书管理员到库房找到这本书,然后回到柜台将这本书交给顾客。一段时间后,客户回来了并将这本书还给图书管理员。图书管理员收下这本书然后将它放回库房。接着,他返回柜台等待下一位顾客。我们假定下一位顾客也要借阅《白鲸》(您看到这本书已经送还回来了)。图书管理员不得不返回库房去找他刚放回去的这本书,然后将其交给客户。如果以这种方式工作,图书管理员取每本书都得返回库房一次,即使那些极受欢迎、借阅率很高的书也要如此。有没有办法来提高图书管理员的工作效率?

       当然有,我们可以给图书管理员一个缓存来解决这个问题。在下一节,我们仍将使用此示例,不同的是图书管理员将使用高速缓存系统。

       我们给图书管理员一个背包,他可以用这个背包装十本书(用计算机术语表达,就是图书管理员现在有一个能装十本书的缓存)。他可以用这个背包来装客户还给他的书,最多可装十本。下面我们使用前面的示例,不过现在的图书管理员可以采用改进的高速缓存新方法。

新的一天开始。图书管理员的背包是空的。我们的第一位客户来了并要借阅《白鲸》。没有取巧的办法,图书管理员必须到库房去拿这本书。他把这本书交给客户。一段时间后,客户回来了并将这本书还给了图书管理员。图书管理员不是把这本书放回库房,而是把它放到背包中,继续接待阅览者(他会先看看背包满没满,随后将更频繁地进行查看)。另一名客户到来借阅《白鲸》。在去库房之前,图书管理员要查看背包中是否有这本书。于是他找到了这本书!他所要做的一切就是从背包中拿出来并把它交给客户。因为无需去库房取书,所以能够更快地为客户提供服务。

      如果客户要借阅的书不在缓存(背包)中又会怎样?在这种情况下,图书管理员在有缓存时的效率比在没有缓存时的效率要低,因为图书管理员要先花时间看看背包中是否有这本书。缓存设计面临的一项重大挑战就是需要将搜索缓存造成的影响降至最低,而现代的硬件几乎已将这种时间延迟缩短为零。即使在我们这个图书管理员的简单示例中,与走回库房的时间相比起来,搜索缓存的延迟时间(等待时间)是如此之小,以至于显得无关紧要。由于缓存比较小(十本书),因此发现包中没有要借的书所花费的时间只是往返库房所需时间中极其微小的一部分。

     通过这个示例,您可以了解到关于高速缓存的几个重要方面:

  • 缓存技术就是采用速度较快但容量较小的存储器来提高速度较慢但容量较大的存储器的速度。
  • 使用缓存时,必须先查看缓存中是否有需要的项目。如果有,则称之为缓存命中。如果没有,则称之为缓存失误,这时计算机就必须等待往返一次读取庞大而又缓慢的存储器。
  • 最大的缓存也远远小于庞大的存储区。
  • 可以存在多级缓存。在我们这个图书管理员示例中,背包是容量较小但速度较快的存储器,库房则代表容量较大且速度较慢的存储器。这是一级缓存。也可以在它们之间再加一级缓存,就是在柜台后面放一个能容纳一百本书的书架。图书管理员可以先查看背包,然后查看书架,最后查看库房。这就构成了一个两级缓存。

       计算机是一种以非常小的增量来度量时间的机器。微处理器对主存储器(RAM) 的访问在大约60纳秒(一秒的六百亿分之一)内完成。这已经相当快了,但与典型的微处理器相比还是慢得多。微处理器的周期可以只有2纳秒那么短,因此对它而言,60纳秒就显得无比漫长。

如果我们在主板上增设容量小但速度非常快(大约30纳秒)的特殊存储器组,结果会怎样?这已比访问主存储器的速度快了两倍。这就被称为2级缓存或L2缓存。如果我们直接在微处理器芯片上构造容量更小但速度更快的存储器系统,结果会怎样?如果这样,系统将以微处理器的速度而非内存总线的速度访问该存储器。这就是L1缓存,在233兆赫兹(MHz)奔腾处理器上,其速度比L2缓存快3.5倍,而L2缓存的速度比主存储器访问速度要快两倍。

       某些微处理器芯片上带有两级缓存。在这种情况下,主板缓存(微处理器和系统主存储器之间的缓存)就成为3级缓存或L3缓存

       计算机中有许多子系统,对于多数子系统而言可以在它们之间安插缓存来提高性能。举一个例子。我们拥有微处理器(计算机中速度最快的部件)。还有对L2缓存(对主存储器进行缓存)进行缓存的L1缓存,主存储器可以作为速度更慢的外围设备(如硬盘CD-ROM)的缓存(主存储器通常用于此用途)。也可以使用硬盘来对速度更慢的介质(互联网连接)进行缓存。

       互联网连接是计算机运行中最慢的环节。因此浏览器(IE、Netscape、Opera等)会使用硬盘存储HTML页面,也就是将它们存放在硬盘上的一个专用文件夹中。首次请求一个HTML页面时,浏览器将显示该页面并在磁盘上保存一个页面副本。下次再请求访问此页面时,浏览器将检查互联网上相应文件的日期是否比缓存文件的日期新。如果日期相同,则浏览器将直接使用硬盘上的文件而不会从互联网上下载文件。在这种情况下,硬盘是容量较小但速度较快的存储器系统,互联网则是容量较大但速度较慢的存储器系统。

      人们也可以直接在外围设备上增设缓存。现代硬盘带有较快的存储器(大约512K),它以硬连线方式与硬盘连接。计算机不直接使用此存储器,它由硬盘控制器直接使用。对于计算机来说,这些存储器芯片就是硬盘本身。当计算机向硬盘请求数据时,硬盘控制器在操纵硬盘机械部件(与存储器相比这非常慢)之前先检查此存储器。如果硬盘控制器在缓存中找到了计算机请求的数据,则它将返回在缓存中存储的这些数据,而不去实际访问硬盘本身的数据,这样就节省了大量时间。

      您可以尝试以下实验。计算机使用主存储器对软驱进行缓存,您可以对此过程进行实际观察。访问软盘上的大型文件,例如,用文本编辑器打开一个300K的文本文件。第一次您会看到软驱上的指示灯亮起,并且需要等上一段时间。软盘的访问速度极慢,因此加载文件将需要20秒钟。现在,关闭编辑器,然后再次打开上述文件。这次(不要等上30分钟或在两次尝试之间执行大量磁盘访问)指示灯不会亮起,您也不需要等待。操作系统检查了软盘的内存缓存并找到了它要找的内容,于是系统很快就在存储器子系统中找到了数据,速度比首次尝试访问数据时的速度快许多(访问一次软盘需要120毫秒,而访问一次主存储器大约只需60纳秒,这快了许多),因此不用再等20秒。您也可以对硬盘进行相同的实验,但因为软驱速度非常慢,所以效果会更明显。

      为了让您对缓存系统有个全面的了解,以下列出了与普通高速缓存系统相关的内容:

  • L1缓存——以全速微处理器速度进行的存储器访问(10纳秒,大小为4-16千字节)
  • L2缓存——SRAM类型的存储器访问(大约20到30纳秒,大小为128-512千字节)
  • 主存储器——RAM类型的存储器访问(大约60纳秒,大小为32-128兆字节)
  • 硬盘——机械装置,较慢(大约12毫秒,大小为1-10千兆字节)
  • 互联网——极慢(在1秒和3天之间,大小不限)

      您可以看到,L1缓存对L2缓存进行缓存,L2缓存对主存储器进行缓存,主存储器对磁盘子系统进行缓存,依次类推。

      讲到这里,人们通常会问:“为什么不让计算机的所有存储器都以L1缓存的速度运行,这样不就无需使用高速缓存了吗?”那样当然可以,但成本会相当昂贵。采用高速缓存的目的就是用较昂贵的小容量存储器来提高价格较便宜但速度较慢的大容量存储器的速度。

      设计计算机时,目标就是让微处理器全速运行,同时让价格尽可能低。500MHz的芯片一秒钟可运行五十亿个周期(每两纳秒一个周期)。如果没有L1和L2缓存,那么访问主存储器将需要60纳秒,这相当于浪费掉约30个访问存储器的周期。

       容量如此小的存储器可以使容量比其大出许多的存储器的使用率达到最大,这真让人觉得不可思议。考虑一下使用256千字节的L2缓存对64兆字节的RAM进行缓存。在这种情况下,容量为256,000字节的存储器能够有效地对容量为64,000,000字节的存储器进行缓存。它为何能发挥这样的作用?

       在计算机科学中,有一个被称作访问局部性的理论概念。它的意思是:在一个较大的程序中,在任何时候,都只有一小部分被使用。尽管这似乎有点奇怪,但访问局部性适用于绝大多数程序。即使是10M大小的可执行程序,在任何时候,该程序中都只有极少数部分得以使用,而且这部分的重复率非常高。在下一页,您将了解到有关访问局部性的更多内容。

      让我们看看下面的伪代码,从而了解为什么访问局部性会起作用(有关详细内容请参见C语言入门教程):

Output to screen « Enter a number  between 1 and 100 »
Read input from user
Put value from user in variable X
Put value 100 in variable Y
Put value 1 in variable Z
Loop Y number of time
   Divide Z by X
   If the remainder of the division = 0
      then output « Z is a multiple of X »
   Add 1 to Z
Return to loop
End

       这个小程序要求用户输入1-100之间的一个数字,然后它读取用户输入的值。接着,程序拿用户输入的数字去除1-100之间的每一个数字。程序检查余数是否是0(模数除法)。如果是0,那么对于从1到100之间的每一个数字,程序都将输出“Z是X的倍数”(例如,12是6的倍数)。而后程序终止。

       即使您对计算机编程所知甚少,也会很容易就明白,在该程序的第11行中,循环部分(第7-9行)执行了100次。其他各程序行只执行一次。由于采用了高速缓存,第7行到第9行的运行速度都将极大提高。

       这个程序非常小,因此整个程序可以轻易地存放到最小的L1缓存中。但我们假定这个程序非常大。结果还是一样。编程时大部分操作都在循环语句内部执行。字处理程序95%的时间都用于等待输入并将输入显示在屏幕上。字处理程序的这一部分就存在于缓存中。

       我们将这种95%比5%的比率(近似)称作访问局部性,正是由于存在访问局部性,缓存才能如此有效地发挥作用。也正是由于存在访问局部性,如此小的缓存才能有效地对大型存储器系统进行缓存。现在,您应当明白为什么全部用最快的存储器来制造计算机是不值得的了。因为通过访问局部性,我们只需花些许成本,就可以达到95%的效率了。

        有关高速缓存及相关主题的更多信息,请查看下一页上的链接。

       

     博闻网相关文章

      更多精彩链接­

 

        原文出处http://computer.bowenwang.com.cn/cache7.htm

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值