cache和buffer的区别

内容整理来自知乎问题“Cache 和 Buffer 都是缓存,主要区别是什么?”https://www.zhihu.com/question/26190832中的几个热评

1、Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的。它的引入是为了减小短期内突发I/O的影响,起到流量整形的作用。比如生产者——消费者问题,他们产生和消耗资源的速度大体接近,加一个buffer可以抵消掉资源刚产生/消耗时的突然变化。

2、Cache(缓存)则是系统两端处理速度不匹配时的一种折衷策略。因为CPU和memory之间的速度差异越来越大,所以人们充分利用数据的局部性(locality)特征,通过使用存储系统分级(memory hierarchy)的策略来减小这种差异带来的影响。

3、假定以后存储器访问变得跟CPU做计算一样快,cache就可以消失,但是buffer依然存在。比如从网络上下载东西,瞬时速率可能会有较大变化,但从长期来看却是稳定的,这样就能通过引入一个buffer使得OS接收数据的速率更稳定,进一步减少对磁盘的伤害。

cache和buffer存在的目的都是为了提速和提高效率

从功能上看,PC挺简单的,就是“输入输出”设备:参数输入进设备(比如鼠标点击),经过计算(CPU),把结果输出到目标设备(比如打印机、显示器、网络)。

我们当然希望PC的速度越快越好,如果说有什么因素在拖慢PC的速度,那也就是在2个过程上起作用:“计算”以及“输入/输出”。

在“计算”上,我们都知道I5肯定比I3快,I9肯定比I5快,这种速度差拼的是纯硬件性能,为了提速,除了花钱购买高端硬件,别无他法。

另一方面,在“输入/输出”(也就是I/O)的过程中拖慢PC的因素,却可以不用花钱就可以解决。这些因素包括I/O过程本身的延迟,以及高速设备与低速设备交互时的等待延迟。Cache和Buffer就是从这2个方向上以软件的方法,以不花钱的方法给PC提速。

举个例子说明两者的作用
假设某地发生了自然灾害(比如地震),居民缺衣少食,于是派救火车去给若干个居民点送水。

救火车到达第一个居民点,开闸放水,老百姓就拿着盆盆罐罐来接水。

假如说救火车在一个居民点停留100分钟放完了水,然后重新储水花半个小时,再开往下一个居民点。这样一个白天来来来回回的,也就是4-5个居民点。

但我们想想,救火车是何等存在,如果把水龙头完全打开,其强大的水压能轻易冲上10层楼以上, 10分钟就可以把水全部放完。但因为居民是拿盆罐接水,100%打开水龙头那就是给人洗澡了,所以只能打开一小部分(比如10%的流量)。但这样就降低了放水的效率(只有原来的10%了),10分钟变100分钟。

那么,我们是否能改进这个放水的过程,让救火车以最高效率放完水、尽快赶往下一个居民点呢?方法就是:在居民点建蓄水池。

救火车把水放到蓄水池里,因为是以100%的效率放水,10分钟结束然后走人。居民再从蓄水池里一点一点的接水。

我们分析一下这个例子,就可以知道Cache的含义了。

救火车要给居民送水,居民要从救火车接水,就是说居民和救火车之间有交互,有联系。

但救火车是“高速设备”,居民是“低速设备”,低速的居民跟不上高速的救火车,所以救火车被迫降低了放水速度以适应居民。
为了避免这种情况,在救火车和居民之间多了一层“蓄水池(也就是Cache)”,它一方面以100%的高效和救火车打交道,另一方面以10%的低效和居民打交道,这就解放了救火车,让其以最高的效率运行,而不被低速的居民拖后腿,于是救火车只需要在一个居民点停留10分钟就可以了。

所以说,蓄水池是“活雷锋”,把高效留给别人,把低效留给自己。把10分钟留给救火车,把100分钟留给自己。

从以上例子可以看出,所谓Cache,就是“为了弥补高速设备与低速设备之间交互时的等待延迟”而设立的一个中间层。因为在现实里经常出现高速设备要和低速设备打交道,结果被低速设备拖后腿的情况。

那么buffer呢? 是从另一个方向降低延迟,与上面的原因不同,该延迟来自于IO过程本身。

比如说吐鲁番的葡萄熟了,要用大卡车装葡萄运出去卖
。但问题是,卡车距离葡萄园很远,于是就需要在葡萄园和卡车之间往返多次才能把卡车装满。往返所需要的时间就是I/O延迟,比如往返各15分钟,总共半小时。

果园的姑娘采摘葡萄,难道是摘一串葡萄,就花15分钟跑到卡车旁边放进去么?如果是这样,100串葡萄就需要往返100次,所需要的时间就是100X15X2分钟,那是何其漫长!

所以聪明的做法就是暂时把100串葡萄放入一个箩筐,再以箩筐为单位倒入卡车,一箩筐(100串)葡萄的往返延迟是半小时。

由此可见,“箩筐”把输入参数暂时集中放在一起,不是“一条一条”,而是“一股脑”地提供给下家处理。

这就大大降低了I/O的次数,也就降低了I/O延迟,提高了速度。

这个箩筐,就是Buffer。

I/O次数过多,除了会造成很大的延迟之外,也会有其它的问题。
以BT为例,BT下载需要长时间的挂机,电脑就有可能24小时连轴转,但BT下载的数据是碎片化的,体现在硬盘写入上也是碎片化的,因为硬盘是机械寻址器件,寻址/写入的过程会带来机械运动,长时间的小碎片写入会造成硬盘长时间高负荷的机械运动,造成硬盘过早老化损坏,当年有大量的硬盘因为BT下载而损坏。

于是新出的BT软件在内存里开辟了Buffer,数据暂时写入Buffer,攒到一定的大小(比如512M)再一次性写入硬盘,这种“化零为整”的写入方式因为大大减小了寻址/写入次数,所以就降低了硬盘的负荷。

这就是:为了完成最终目标:把数据写入硬盘空间,需要暂时写入Buffer的空间。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值