PCEVA,PC绝对领域,探寻真正的电脑知识
打印 上一主题 下一主题
开启左侧

【原创】我来说说,到底什么是“缓存”

  [复制链接]
跳转到指定楼层
1#
haierccc 发表于 2012-5-23 19:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
点击数:11028|回复数:29
本帖最后由 haierccc 于 2012-5-24 16:05 编辑

  我们经常在各种场合听到“缓存”这个词,那么,到底什么是“缓存”,它起到的是什么作用呢?我用通俗的语言讲一讲吧。
       “缓存”这种东西,是为了平衡“高速设备”和“低速设备”之间的速度差异而存在的。其作用是让低速设备“尽量”的不拖高速设备的后退。
      比如CPU缓存,每当CPU要从内存里读数据的时候,会向内存控制器发出一个读指令,要求内存控制器返回其要求的数据,可是因为内存响应速度相对于CPU是很慢的(比如DDR3内存),所以在数据返回之前CPU只有无所事事的“等待”,如果经常出现这样的情况,再快的CPU,效率也不会提高(被低速的内存托了后退)。
     但是有种高速内存(SRAM),它的响应速度能跟CPU同步,也就是说CPU无需等待,如果用SRAM做主内存当然是最理想的选择。可问题是这种内存制造复杂,价格昂贵,容量也做不大(或者价格无法接受),不可能做到DDR3内存这样的GB级别,于是乎可以采取这样的折中方法:




      如图所示,在主内存(RAM)和CPU之间,放一块小容量的SRAM。当CPU申请RAM数据的时候,先在SRAM里面寻找,如果找到了数据(即“命中”),就不用花费很多时间到RAM里去读了(同步读取)。如果SRAM里没有数据,再到RAM去读,当RAM返回数据的时候,不仅仅返回原来所需要的数据,同时“捎带”返回所需数据“前后”的一些看似无关的数据,并将这些数据放入SRAM。
       下次CPU再次到SRAM里读数据的时候,如果所需数据正好在SRAM里(捎带回来的那些数据),就可以“命中”了。
        从原理上可以看出,命中率越高,CPU的效率就越高。而命中率又是被“捎带”返回的数据所决定的,哪些数据被捎带返回,这个就要依CPU内部的缓存算法而定了。
       由此可见,由于缓存容量远远小于主内存容量,而缓存算法也不可能100%的准确命中,所以低速设备多多少少还是会拖高速设备的后腿,这就是上面所言“尽量”的含义所在(除非哪天主内存完全和CPU同步)。
       以上是以CPU缓存做例子。但是在电脑系统里,缓存并不仅仅是CPU独有,因为高速设备与低速设备的矛盾并不仅仅体现在CPU和内存之间。硬盘板载缓存就是另一个例子。
       机械硬盘是机械部件,靠盘片的旋转和磁头臂的摆动来定位数据,靠磁场的涨落来读写数据,这些动作相比于电压的瞬间变化(二进制): 来说,是相当缓慢的。机械硬盘的访问速度和CPU的主频相比,简直就是火箭和牛车的对比。同样,机械硬盘相比于内存速度的速度差也是巨大的。
       现在假如说,我要把数据从内存写入硬盘,由于硬盘相当缓慢,需要等待很长的时间才能完成此任务。那么用户体验就是:电脑非常慢。实际上,这里CPU不慢,内存不慢,只是硬盘太慢了。
       为解决机械硬盘速度过慢的问题,就在其内部安置了一个小容量的内存,也就是硬盘的缓存,数据首先写入到缓存里。那么在操作系统层面,就会认为数据已经写入了(写入过程很快结束)。用户的感觉就是快速。随后硬盘自己再从缓存写入到盘片,这个过程无需用户干预了。
       不过需要注意的是,其实硬盘的缓存并不全都用于缓存数据,还有其他用途,所以不见得缓存越大,性能就越好。而且还有个缓存算法问题。如果算法不优秀,命中率就不会高,这样大容量缓存形同虚设。
       以上讲的是硬盘的板载缓存,也就是硬件缓存。其实操作系统本身也有磁盘缓存,也就是说,操作系统从系统主内存(比如DDR3内存)中划出一块内存作为磁盘缓存。要写入磁盘的数据首先写入主内存,因为主内存容量大而速度快,所以写入过程很快结束(用户体验良好,认为电脑很快),然后系统自动将内存中的数据写入硬盘。但如上述文字所示,实际上写入的是硬盘的板载缓存。此时的数据写入流程如下:
       数据→系统主内存缓存→硬盘板载缓存→硬盘
       可见此时数据的写入过程经过了2级缓存。关于这方面的内容,请见本论坛另一篇文章:谈大容量内存的各种使用方案对磁盘效率影响里面有详细的讨论。

       缓存另一个例子就是打印机,因为打印机也是机械部件,速度缓慢 。
      当你开始打印的时候,屏幕右下角会有个打印机图标,你双击,可以看到里面有打印任务。有时候会出现:打印任务已经消失,可是打印机仍然在继续打印。
        出现这种情况的原因就是:打印机内部有一小块缓存。操作系统(比如XP,WIN7)把打印任务发送给打印机,在尚未发送完毕的时候,打印任务是存在的,而发送完毕之后,任务消失。
      可是”发送完毕“,并不代表”打印完毕“,此时的数据实际上是存在打印机缓存里的,所以可以脱离WIN7而”自动“打印。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
2#
fmplayer 发表于 2012-5-24 01:22 | 只看该作者
buffer 和 cache的区别?

能否简要指点下。谢谢
3#
haierccc  楼主| 发表于 2012-5-24 06:52 | 只看该作者
本帖最后由 haierccc 于 2012-5-25 17:33 编辑

      看到你的问题,我的第一直觉是,buffer 和 cache是同一个概念的2个不同名词。
       我随即百度了一下,百度上对于这2个概念是有区分的:
       百度的解释是:
1:cache是CPU的缓存,而buffer是磁盘的缓存(这个解释值得商榷)。
2:cache是用户不可编程的(如CPU和硬盘的chache,拥有独立的存储器,缓存算法固化于设备内部),而buffer是用户可编程、可寻址的(如win7从主内存中分配的buffer)
3:chache往往是板载硬件,容量大小固定,而buffer是从系统内存划分,用户可自行分配大小(原因同第二条)
       从上述文字看,buffer 和 cache所起的作用,都是“缓存”,都是用于平衡不同设备之间的速度差,只不过是实现的主体不同。所以我还是认为,这是描述同一个概念的2个不同名词。
4#
大D来了 发表于 2012-5-24 08:52 | 只看该作者
一般来说cache是处理器内置的,buffer是外置的
一般cache指CPU咯L1 L2 L3
buffer的话就更多设备了
5#
wsy2220 发表于 2012-5-24 09:24 | 只看该作者
cache一般指寄存器,也就是cpu或者芯片内部的缓存.
6#
kinno 发表于 2012-5-24 09:56 | 只看该作者
wsy2220 发表于 2012-5-24 09:24
cache一般指寄存器,也就是cpu或者芯片内部的缓存.

cache不是寄存器,cache是sram,新cpu的cache都是与核心同步运行了,记得以前有段时间cache是半速运行的。
寄存器是触发器与锁存器(请科普)结构,与核心同步
7#
wsy2220 发表于 2012-5-24 09:58 | 只看该作者
kinno 发表于 2012-5-24 09:56
cache不是寄存器,cache是sram,新cpu的cache都是与核心同步运行了,记得以前有段时间cache是半速运行的 ...

明白了,我是觉得cache和buffer差不多的意思...
8#
James007ss 发表于 2012-5-24 10:40 | 只看该作者
缓冲你可以理解为把一些难以处理的数据进行“打包”之类后处理,进而提高效率。
缓存你可以理解为把一些经常处理的数据进行“预备”之类的处理,进而提高效率。

http://bbs.pceva.com.cn/forum.ph ... 0625&pid=494697

2楼的问题,在同样内容的傻傻问里也有人提过,可以看看浴室的解释,buffer=缓冲,cache=缓存。
9#
roxxman 发表于 2012-5-24 12:31 | 只看该作者
说白了就是存储体系的各个组成部分,刚刚考完计算机系统结构,很大一部分篇幅就是讲这个东西。
10#
gatwin 发表于 2012-5-24 19:03 | 只看该作者
haierccc 发表于 2012-5-24 06:52
看到你的问题,我的第一直觉是,buffer 和 cache是同一个概念的2个不同名词。
       我随即百度了一 ...

一个是缓冲用的,一个是暂存用的。编程上面是这样的
11#
bssharp 发表于 2012-5-25 14:26 | 只看该作者
果然有人讨论buffer与cache啊……翻译上前者是“缓冲(区)”,后者是缓存。
buffer是编程中的概念,比如memmove、strncpy或者fread这样的串操作函数都有个buffer大小的参数,意思就是写入目标区域的数据不能超过这些,以免访存越界。dos有255字节的键盘缓冲区,所以一条命令不能超过这个长度。
9l这么早就考试啊,我这学期也有computer architecture。。离考试还有一个月呢。
12#
yanleiberg 发表于 2012-5-26 02:16 | 只看该作者
关于cache和buffer,可以看看我在另外一个帖子里的解释。
http://bbs.pceva.com.cn/forum.ph ... id=40625&page=2

Buffer是为了解决速度不同的两种I/O设备之间一次性数据传输时同步问题的。
Cache则是为了解决高速设备多次读取同一个数据时的命中率和延时问题的。


比如说你从大汽油桶(高速设备)里往矿泉水瓶子(低速设备)里面倒油,就这么直接倒很费力,因为你要尽量使汽油桶出油的速度和矿泉水瓶进油的速度保持一致。如果倒快了,油撒了,也就是低速设备(矿泉水瓶)的速度跟不上,数据丢失;如果倒慢了,那又浪费时间。

Buffer就是一个在矿泉水瓶上的漏斗,汽油桶先把漏斗灌满,然后就不用管漏斗了,漏斗往矿泉水瓶漏油是会和矿泉水瓶子完全同步,既不会浪费矿泉水瓶(低速设备)的速度也不会漏到外面,只要在漏斗里的油全漏光之前汽油桶再来把漏斗倒满就好了。

13#
yanleiberg 发表于 2012-5-26 03:10 | 只看该作者
再说一下buffer和cache的异同吧。

相同点:
1. 目的:都是为了解决高速与低速设备之间的数据传输问题。
2. 解决方案:都可以是硬件自身集成,也可以是程序中使用。

不同点:
目的:buffer是为了解决高速向低速设备一次性写入数据时的同步性问题,而cache则是为了解决高速设备多次从低速设备读取时的延时性和命中性问题。


举个具体的例子,做bt下载和上传,bt软件会划分一块内存,那么这块内存到底应该叫cache还是buffer呢?
我的看法是,下载的时候就是buffer,上传的时候就是cache。
不过bt时的特别点是这块内存主要的作用用来保护机械硬盘的,而不是加速。
14#
haierccc  楼主| 发表于 2012-5-26 07:26 | 只看该作者
本帖最后由 haierccc 于 2012-5-26 07:28 编辑
我的看法是,下载的时候就是buffer,上传的时候就是cache。


如果从以“‘我’是否可以控制缓存的算法和大小”的角度来定义的话,这样解释也是对的。
15#
qingxigreat 发表于 2012-5-26 09:10 | 只看该作者
与SRAM对应的,应该是DRAM哦,RAM是这两个的总称
我们现在使用的DDR3内存,全称是 DDR3 SDRAM=Double Data Rate 3    Synchronous Dynamic    Random Access Memory
DRAM是最早期的内存,称为 “动态”随机存取存储器。因为工作原理的原因,需要不断刷新才能维持记录的数据(毫秒级),所以称为动态
后来前边多了个S, Synchronous ,称为 “同步动态”随机存取存储器。我最开始用的就是这一代
再后来,前辍多了个DDR,Double Data Rate,提升了一倍速率,之后DDR2代,3代,每一代都比前代提升了一倍速率,容量也几乎相当翻倍。

用作高速缓存的SRAM,S=Static,与DRAM不同,存储数据后不需要不断刷新,所以称为静态的。这种内存成本很高,并且加大容量后速度会降低。
所以才有了现在的,高速缓存》内存》硬盘 的三级存储结构。


本来只打算回第一句话的,可能一大早精神好,一下打了这么多字出来。。。
16#
JamesHuang 发表于 2012-5-31 17:02 | 只看该作者
技术贴,学习一下
17#
haierccc  楼主| 发表于 2012-5-31 21:39 | 只看该作者
希望有朝一日不需要什么缓存了,内存同步就OK了
18#
飞云零狼 发表于 2012-6-2 01:02 | 只看该作者
好帖子啊!
19#
SnowGround 发表于 2012-6-2 08:23 | 只看该作者
晕倒,buffer和cache。

cache是指硬件,物理概念。buffer是指需要使用缓存的程序在硬件里申请的一片连续的存储空间,逻辑概念。

就好像网络传输中的网卡和VLAN接口一样,看起来都是接口,但是却工作在不同的层面。

简单地讲,在开发程序的时候,你申请一段内存空间做为你进行硬件I/O的buffer,至于这个buffer是放在内存,还是放在cache里,还是都放,又或是放在pagefile里?。都可以,放在哪里都是你可用的buffer。

而具体是放在哪,那是操作系统的内存调度算法、CPU的缓存调度算法应该去完成的事情,在用户层面的你就不需要操心了。
20#
haierccc  楼主| 发表于 2012-6-3 02:00 | 只看该作者
本帖最后由 haierccc 于 2012-6-4 18:59 编辑

SnowGround 发表于 2012-6-2 08:23
晕倒,buffer和cache。

cache是指硬件,物理概念。buffer是指需要使用缓存的程序在硬件里申请的一片连续的 ...


      看来各有不同的理解,前几楼说cache与buffer的概念与软硬件无关,而楼上又说是有关。
     到底是有关还是无关呢,欢迎各位各抒己见
     我现在倾向于认为cache应该与软硬件无关,关键要看缓存的操作者是谁。如果“我”(也就用户)无法操作,那么就是chache,也就是说cache对于用户是“透明”的。(因为无法操作,所以透明)。而Buffer是用户操作的,所以不是透明的(比如win7从内存中分配的磁盘缓存,这里的“用户”指的是操作系统)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部