缓存是什么呀?经常听到别人说什么缓存不
如果你曾经购买过电脑,那么你肯定听过“缓存”(cache)这个词吧,现代的电脑同时具有L1和L2 cache 。你可能在购买电脑的时候也听到过要好的朋友这样建议,“不要购买赛扬(Celeron)系列处理器,因为它的cache比较少”。
在电脑系统里,缓存在很多方面都起着举足轻重的作用, 并且它以各种各样的形式存在不同的硬件里面。其中有内存缓存,硬盘和软盘缓存,软件磁盘缓存,还有页面缓存等更多;虚拟内存也是另外一种不同表达形式的缓存。 在这篇“神奇的硬件”文章里面,我们将会探究缓存,你可以 从中明白它的工作原理,并且知道为什么它在电脑系统中的地位是这么的重要。
一个简单的例子
超高速缓...全部
如果你曾经购买过电脑,那么你肯定听过“缓存”(cache)这个词吧,现代的电脑同时具有L1和L2 cache 。你可能在购买电脑的时候也听到过要好的朋友这样建议,“不要购买赛扬(Celeron)系列处理器,因为它的cache比较少”。
在电脑系统里,缓存在很多方面都起着举足轻重的作用, 并且它以各种各样的形式存在不同的硬件里面。其中有内存缓存,硬盘和软盘缓存,软件磁盘缓存,还有页面缓存等更多;虚拟内存也是另外一种不同表达形式的缓存。
在这篇“神奇的硬件”文章里面,我们将会探究缓存,你可以 从中明白它的工作原理,并且知道为什么它在电脑系统中的地位是这么的重要。
一个简单的例子
超高速缓存(Caching)是计算机里面基于内存子系统的技术。
使用缓存的主要目的是使价位低廉的电脑也可以保持高速运行;超高速缓存允许你的电脑在运行日常任务的时候能够更加 流畅、快速。
为了明白隐藏在缓存系统后面的基本思想,让我们使用一个超级简单的图书管理员例子来证明缓存的概念。
现在我们来想象一个图书管理员站在他的桌子后面, 他的任务就是递给你请求租借的书本。为了使你更加简单明了,我们现在猜想你自己找不到需要的这些书籍--所以你必须询问管理员你需要的书在那里,另外他会从储书房把你需要的书给取来。
首先,让我们从图书馆管理员没有缓存 的时候开始。
首个顾客抵达了,他询问白鲸记(Moby Dick)这本图书;图书管理员走到库房,找到了这本书,返回柜台并递给顾客。稍后,这个客人回来并归还了这本书;图书管理员拿着这本书,走到库房并把书放置在它原来的里 ;他接着又返回柜台等待其他顾客的来临。
我们想象接下来的顾客也是询问白鲸记(你看到他来了。。。),图书管理员不得不返回库房并找出他刚刚才放置好的图书。在这种情况下,图书管理员为了拿每本书不得不走一个 来回的路程---即使是每个人都需要的非常流行的图书。
那么,有什么办法可以改进图书管理员的效率呢?
是的,有这样的办法,我们可以在图书管理员身上放置缓存。让我们给图书管理员 装备一个背包,它可以装下10本图书(如果用电脑术语表示就是,现在图书管理员拥有10本书的缓存(cache))。
在背包里面,图书管理员可以放置顾客归还的图书,最大数量为10本。让我们 再次使用先前的例子,但这回不同的是角色,因为我们这里使用了新的和改进的图书管理员:缓存版本:)。
新的一天开始了,际楣芾碓钡谋嘲强盏摹J赘龉丝偷执锪耍拾拙牵∕oby Dick)这本图书;图书管理员走到库房,找到了这本书,返回柜台并递给顾客。
稍后,这个客人回来并把书归还给了图书管理员;这次图书管理员可不会再走到库房并把书摆放在原来的地方,他只是把书放在背包并继续站在那里就可以了(他首先会检查背包是否满了--这个问题稍后将谈到)。另外的顾客抵达并询问白鲸记;在他走向库房之前,他会首先检查背包以看顾客需要的书是否在背包里。
他发现了!他需要做的仅是从背包里把书拿出来并递给客人。他不需要再 花费来回库房的路程,现在他的工作看起来也更加有效率了。
如果顾客询问的书本标题不在缓存(背包)里,那该怎么办呢?在这种情况,图书管理员有缓存就比没有缓存的效率更加低下了;因为他必须首先花时间检查背包。
所以现在急待解决的问题是,最少化缓存设计中检查缓存所带来的影响,在现代的硬件实际上已经把该时间减少到了零。即使在我们简单的图书管理员的例子 里,检查缓存的时间与往返库房的无关时间相比,检查缓存所带来的延迟(等待时间)也是非常短的。
缓存比较小(10本书),花费的检查时间也就越短。
从这个例子你可以了解到关于缓存的几个重要事实:
缓存技术是使用比较少容量但却非常高速的内存类型,用于加速比较慢却具有大容量的内存类型。
在使用缓存的时候,你必须检查缓存看需要的数据是否在那里。如果在,就称作缓存命中(cache hit);否则就称作缓存击不中(cache miss),这时候计算机必须 花费从大容量、慢内存区域读取数据的来回旅程。
缓存具有最大的容量,但却比大的存储区(主内存)小很多。
可以具有多层缓存。以我们图书管理员的例子,比较小但更快速的内存类型就是背包,库房则代表更大却比较慢的内存类型。背包是一级缓存,但在柜台里面却可以 还有由书架组成,可以存放100本书的二级缓存。
图书管理员可以首先检查背包,然后再到柜台的书架,接着就是库房。现在就有两级缓存了。
电脑缓存
电脑是我们用极小的增量衡量时间的机器。当微处理器访问主内存(RAM)的时候,它大约需要花费60纳秒的时间;这是相当快的,但这与典型的微处理器的处理速度来说却是非常慢的。
微处理器的周期时间短达2钠秒,因此60钠秒相对于微处理器来说就如来生那么漫长。
如果我们在处理器里面构建特殊的存储体,比较小却非常快速(大约30钠秒之间),会怎么样呢?这大约是主内存速度的两倍。
我们称之为2级缓存,或者是L2 cache 。如果我们构建容量更加小,但速度却要快上很多的内存直接访问微处理器芯片,那又会怎么样呢?这样处理器就能够以处理器总线的速度访问内存,而非内存总线的速度:这是L1 cache 。
在Pentium 233MHz 处理器里面,L1 cache的速度是L2 cache的3。5倍, 后者是访问主内存速度的两倍。
计算机里面还有其它的子系统;你可以在它们之间加入缓存以提高性能。
下面是例子,我们拥有一颗微处理器(电脑里面最快速的东西)。L1 cache 缓存L2 cache,L2 cache 缓存主内存,内存还可以用于缓存其它较慢的周边设备,例如硬盘和光驱等。硬盘也还可以用于缓存其它更慢的媒体--你的 英特网连接。
英特网连接(Internet connection)是你的电脑系统里面最慢的连结。因此你的浏览器(Internet Explorer, Netscape, Opera, 等)会使用硬盘储存HTML 页面,把这些内容放置到硬盘里面特殊的文件夹下面。
你访问HTML 页面的时候,浏览器会向Internt递交请求,并把反馈的内容复制一份储存在硬盘里。当你第二次访问相同页面的时候,你的浏览器会首先检查网络上的文件是否比缓存的文件更新。如果日期相同,你的浏览器会直接把储存在硬盘的文件反馈给你,而不是从网络上下载相同的文件。
在这种情况下,较小较快的内存系统就是硬盘;而更大容量却较慢的内存系统就是Internet 。
缓存还可以直接建立在外围设备(peripheral)上。现代的硬盘一般使用了快速的内存,容量最流行的为512KB/2MB/8MB等不同的版本。
电脑不能够直接使用这些内存,因为它们是 由硬盘控制器控制的。在该系统里面,这些内存芯片就是硬盘本身。 当电脑从硬盘请求数据的时候,硬盘的移动机械部分(磁头)[与内存相比要慢很多]会首先检查硬盘上的缓存。
如果它在缓存里发现了电脑请求的数据,它就会从缓存里反馈需要的数据 的请求,而不需要从磁盘本身访问该数据,这样就节省了大量的时间。
下面是一个你可以尝试的实验。你的电脑用主内存缓冲了软盘驱动器,这里你可以看到非常明显的效果。
从软盘访问一个较大的文件--例如用文本编辑器打开1个300KB的文本文件。在这里,你看到软盘的灯会亮着,你需要等待。软盘真的比较慢,打开这样的文件你大概需要等待20秒。打开之后,你接着把编辑器给关了,并打开相同的文件。
这次(第二次),你将不会看见闪亮的软驱读取灯,也不需要等待,文件立刻就打开了。操作系统会检查它为软盘驱动器准备的缓存,并找出它需要寻找的内容。因此这次你不需要等待,你需要的内容会直接从内存子系统调动出来,这比你首次从软盘调动内容的时候要快很多(从软盘驱动器读取一次内容大约需要花费120毫秒,而主内存只需要花费大约60钠秒--要快很多)。
你可以在硬盘上运行相同的测试,但 结果来得没有那么明显,因为软盘驱动器特别慢。
为了可以给你更加直观描绘,下面是普通缓存系统的表单:
L1 cache -以处理器的全速访问内存(10钠秒,4KB--18KB 容量)
L2 cache -以SRAM的类型访问内存(大约20-30钠秒,128KB-512KB容量)
主内存 -以RAM的类型访问内存(大约60钠秒,32MB-128MB容量)
硬盘 - 机械,慢(大约12毫秒,1GB-10GB容量)
英特网 -不 可置信的慢(大约1秒-3天,不限容量)
如你所看到的,L1 cache 缓存L2 cache,后者缓存主内存,主内存通常用于缓存磁盘子系统,等等。
注意:容量随着时间的迁移 缓存的容量已经发生了很大的改变,例如现在普遍都使用256MB的内存,主流的硬盘容量也达到了80GB ,但原理依然如此。
缓存技术
在这个观点上有个很普遍被询问到的问题,“为什么不使电脑的所有内存运行在与L1 cache 相同的速度呢,那样就不需要高速缓存了吧?”这样的办法是可行的,但是带来的价格将是不可置信的昂贵。
高速缓存的观念是使用少量昂贵的内存来加速容量巨大,却相对缓慢和廉价的内存。
在设计电脑的时候,目的是让微处理器在尽可能廉价的情况下可以全速运行。1颗500-MHz 的芯片每秒可以运行大约5亿次周期(每两钠秒1个周期)。
在没有L1和L2 cache的情况下,访问主内存需要60钠秒的时间,或者可以说访问内存的时候浪费了30个周期。
你可能会考虑到,这小量的内存可以提高大容量内存的使用效率。考虑到256KB 的L2 cache 可以缓存64MB的RAM,在这个情况下,256,000 bytes 容量的内存有效率地缓存64,000,000 bytes内存;那么它是怎么工作的呢?
在计算机学科,我们有个称为访问的局部性(locality of reference)的理论概念。
它意味着在一个相当大的程序里面,每次仅有小部分可以被使用。直观点就可以说,访问局部性是为巨大数量的程序而工作的。即使需要执行的程序容量有10MB,但每次从程序取出的数据可能仅有几byte,并且它们的使用重复率是相当高的。
下面让我们看看这段假冒的代码以了解访问局部性的代码是怎么工作的(想要 详细的了解就请看C程序是怎么工作的:将在以后推出)。
输出到屏幕吗?输入1到100之间的数字?
从用户的输入读取
把用户输入的数值赋予给变量X
把值100赋予给Y
把值1赋予给Z
Y数值循环的次数
将Z除以X
如果剩余的余数 = 0
那么输出 ?Z 是X?的倍数
把Z加上1
返回循环
结束
上面的小程序叫用户输入1到100之间的数字,然后它会从用户的输入中读取相应的数值。
接着,程序会把每个1到100之间的数字与用户输入的数字相除。程序会把检查是否余数为0(取模除法)。如果是,程序会输出“Z是X的倍数”(例如,12是6的倍数),接下来是1到100之间的每个数 按照上面的步骤得出的结果,最后程序结束。
即使你不明白任何电脑程序方面的内容,你也可以轻易地理解上面的11行程序代码,其中循环部分(第7到第9行)要被执行100次,而其它的代码仅执行一次。因为缓存的缘故,7到9行的代码执行起来会更快速。
这个程序非常细小,即使在最小容量的L1 cache也可以完全容纳,但在这里让我们假设这个程序是非常大的 ,但结果仍旧是相同的。当你执行程序的时候,在循环里面需要占据很多操作。一个文字处理器需要花费95%时间等待你输入并把结果显示在屏幕上。
该部分字处理程序 就会被放置在缓存里面。
这里,95%与5%的比率(近似地)就我们称之为访问的局部性,这也是为什么缓存工作起来是那么有效率了,另外也是为什么小量的缓存可以高效率地缓存这么大的内存系统。
你现在应该可以理解为什么不在电脑的所有地方都使用大量最快速的内存了。 因为我们可以使用小量的花费就可以获得95%的效率。
。收起