简单总结

  1. cache 是为了弥补高速设备低速设备的鸿沟而引入的中间层,最终起到加快访问速度的作用。
  2. 而 buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以减少响应次数(比如从网上下电影,你不能下一点点数据就写一下硬盘,而是积攒一定量的数据以后一整块一起写,不然硬盘都要被你玩坏了)。
  • 要问 Cache 和 Buffer 的区别,首先要问另一个问题:为何会存在 Cache 和 Buffer?

为了提速。

细看 cache

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

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

在“计算”上,我们都知道 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,就是“为了弥补高速设备与低速设备之间交互时的等待延迟”而设立的一个中间层。因为在现实里经常出现高速设备要和低速设备打交道,结果被低速设备拖后腿的情况。

参考

  1. 知乎问题:缓冲和缓存的区别
  2. https://www.zhihu.com/question/26190832/answer/140368830
  3. https://www.zhihu.com/question/26190832/answer/32387918