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

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

  [复制链接]
跳转到指定楼层
1#
haierccc 发表于 2012-5-23 19:59 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
点击数:11127|回复数: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
30#
thenero 发表于 2012-7-25 16:09 | 只看该作者
通俗的来讲buffer是傻交换负责把数据中转后发向目的地,cache是互联网加速器,先查询下有无数据有数据本地调用无数据访问互联网。
29#
thenero 发表于 2012-7-25 16:05 | 只看该作者
以下文字引用字:http://tech.ddvip.com/2007-09/119026496435105.html 致谢

  buffer 与cache 的区别

  A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use.

  更详细的解释参考:Difference Between Buffer and Cache


  cache 和 buffer的区别:

  Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期, Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。

  Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。

  Free中的buffer和cache:(它们都是占用内存):

  buffer : 作为buffer cache的内存,是块设备的读写缓冲区

  cache: 作为page cache的内存, 文件系统的cache

  如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小
28#
haierccc  楼主| 发表于 2012-7-24 22:11 | 只看该作者
很久没来了,我顶一下,呵呵
27#
SnowGround 发表于 2012-6-28 07:52 | 只看该作者
光驱硬盘打印机里面的硬件当然只能叫Cache,你没开机,没上电,它永远只能叫Cache

开了机上了电,映射了地址可供访问了。它还是叫Cache。
你把它申请下来准备往里面填数据了,你申请下来的这部分空间就是你的Buffer。整个硬件还是叫Cache。
做完事你把它释放了。你的Buffer就没了。而Cache还是Cache,它物理存在在那里。

这是我的看法。楼下继续。
26#
a315344690 发表于 2012-6-27 17:10 | 只看该作者
技术贴,学习一下,只知道cache是缓存
25#
dlsuki 发表于 2012-6-26 07:56 | 只看该作者
buffer:
In computing, a buffer is a region of memory used to temporarily hold data while it is being moved from one place to another. Typically, the data is stored in a buffer as it is retrieved from an input device (such as a keyboard) or just before it is sent to an output device (such as a printer). However, a buffer may be used when moving data between processes within a computer. This is comparable to buffers in telecommunication. Buffers can be implemented in either hardware or software, but the vast majority of buffers are implemented in software. Buffers are typically used when there is a difference between the rate at which data is received and the rate at which it can be processed, or in the case that these rates are variable, for example in a printer spooler.


cache:
In computer science, a cache (pronounced /ˈkæʃ/, like "cash" [1]) is a collection of data duplicating original values stored elsewhere or computed earlier, where the original data is expensive to fetch (owing to longer access time) or to compute, compared to the cost of reading the cache. In other words, a cache is a temporary storage area where frequently accessed data can be stored for rapid access. Once the data is stored in the cache, future use can be made by accessing the cached copy rather than re-fetching or recomputing the original data, so that the average access time is shorter. Cache, therefore, helps expedite data access that the CPU would otherwise need to fetch from main memory.

也就是说当你把数据写入目标设备时,需要考虑这个设备的单位时间内的数据接受能力和处理能力, 如果接受能力大于处理能力的话, 就有必要加个buffer来缓冲下.
cache是用来临时存放经常需要读取的数据的地方, 它的访问速度通常要快于保存这些数据的设备, 所以把这些数据预读到cache里能提高访问速度.
其实buffer和cache有时候也是结合在一起用的, 比如数据库的buffer pool, 这里面的数据最终是要被写到数据文件里面,从这方面说它是buffer.这个里面的数据也可以被其他的进程访问, 以提升读取速度, 从这方面看又有cache的应用了.
24#
danielmiao 发表于 2012-6-25 22:10 | 只看该作者
本帖最后由 danielmiao 于 2012-6-25 22:13 编辑

Buffer是编程时候提高程序效率设的缓冲区,Cache是硬件中间的缓寸,完全没有研究的意义
23#
黯淡的风 发表于 2012-6-15 18:30 | 只看该作者
学习了 绑定
22#
haierccc  楼主| 发表于 2012-6-15 17:17 | 只看该作者
我认为这种不可控制的缓存,的确不应该叫Buffer,而应该叫cache。
21#
yanleiberg 发表于 2012-6-5 01:02 | 只看该作者
SnowGround 发表于 2012-6-1 19:23
晕倒,buffer和cache。

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


那请问光驱硬盘打印机里的自带的缓存难道不叫buffer?难道是用户可控制的?
编程领域里的buffer只是buffer一种,并不是所有。
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从内存中分配的磁盘缓存,这里的“用户”指的是操作系统)。
19#
SnowGround 发表于 2012-6-2 08:23 | 只看该作者
晕倒,buffer和cache。

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

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

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

而具体是放在哪,那是操作系统的内存调度算法、CPU的缓存调度算法应该去完成的事情,在用户层面的你就不需要操心了。
18#
飞云零狼 发表于 2012-6-2 01:02 | 只看该作者
好帖子啊!
17#
haierccc  楼主| 发表于 2012-5-31 21:39 | 只看该作者
希望有朝一日不需要什么缓存了,内存同步就OK了
16#
JamesHuang 发表于 2012-5-31 17:02 | 只看该作者
技术贴,学习一下
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不同,存储数据后不需要不断刷新,所以称为静态的。这种内存成本很高,并且加大容量后速度会降低。
所以才有了现在的,高速缓存》内存》硬盘 的三级存储结构。


本来只打算回第一句话的,可能一大早精神好,一下打了这么多字出来。。。
14#
haierccc  楼主| 发表于 2012-5-26 07:26 | 只看该作者
本帖最后由 haierccc 于 2012-5-26 07:28 编辑
我的看法是,下载的时候就是buffer,上传的时候就是cache。


如果从以“‘我’是否可以控制缓存的算法和大小”的角度来定义的话,这样解释也是对的。
13#
yanleiberg 发表于 2012-5-26 03:10 | 只看该作者
再说一下buffer和cache的异同吧。

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

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


举个具体的例子,做bt下载和上传,bt软件会划分一块内存,那么这块内存到底应该叫cache还是buffer呢?
我的看法是,下载的时候就是buffer,上传的时候就是cache。
不过bt时的特别点是这块内存主要的作用用来保护机械硬盘的,而不是加速。
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就是一个在矿泉水瓶上的漏斗,汽油桶先把漏斗灌满,然后就不用管漏斗了,漏斗往矿泉水瓶漏油是会和矿泉水瓶子完全同步,既不会浪费矿泉水瓶(低速设备)的速度也不会漏到外面,只要在漏斗里的油全漏光之前汽油桶再来把漏斗倒满就好了。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部