要问Cache和Buffer的区别,首先要问另一个问题:为何会存在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分钟。
那么,我们是否能改进这个放水的过程,让救火车以最高效率放完水、尽快赶往下一个居民点呢?
方法就是:在居民点建蓄水池。(PS:提前蓄水)
救火车把水放到蓄水池里,因为是以100%的效率放水,10分钟结束然后走人。居民再从蓄水池里一点一点的接水。
我们分析一下这个例子,就可以知道Cache的含义了。
救火车送水,居民要水,居民和救火车之间有交互。但救火车是“高速设备”,居民是“低速设备”,低速的居民跟不上高速的救火车,所以救火车被迫降低了放水速度以适应居民。
为了避免这种情况,在救火车和居民之间多了一层“蓄水池(也就是Cache)”,它一方面以100%的高效和救火车打交道,另一方面以10%的低效和居民打交道,这就解放了救火车,让其以最高的效率运行,而不被低速的居民拖后腿,于是救火车只需要在一个居民点停留10分钟就可以了。

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

回到PC。CPU速度很快,但CPU执行的指令是从内存取出的,计算的结果也要写回内存,但内存的响应速度跟不上CPU。

CPU跟内存说:你把某某地址的指令发给我。内存听到了,但因为速度慢,迟迟不见指令返回,这段时间,CPU只能无所事事的等待了。这样一来,再快的CPU也发挥不了效率。

怎么办呢?在CPU和内存之间加一块“蓄水池”,也就是Cache(片上缓存),这个Cache速度比内存快,从Cache取指令不需要等待。

当CPU要读内存的指令的时候先读Cache再读内存,但一开始Cache是空着的,只能从内存取,这时候的确是很慢,CPU需要等待。但从内存取回的不仅仅是CPU所需要的指令,还有其它的、当前不需要的指令,然后把这些指令存在Cache里备用。

CPU再取指令的时候还是先读Cache,看看里面有没有所需指令,如果碰巧有就直接从Cache取,不用等待即可返回(命中),这就解放了CPU,提高了效率。(当然不会是100%命中,因为Cache的容量比内存小)

<img src="https://pic3.zhimg.com/50/v2-e62c6d9272aedc29ee30c6f36ebb780a_hd.jpg" data-caption="" data-size="normal" data-rawwidth="398" data-rawheight="396" class="content_image" width="398">

CPU的Cache,可以有好几层,而且还分数据Cache和指令Cache。

也许你会问,既然Cache的响应速度快,CPU不需要等待,那为啥还要用“慢速”的内存条呢?直接用Cache不就得了?这是因为在具体制造上有困难,大Cache不但成本无法接受,而且容量大了延迟也会上升。

磁盘缓存也是Cache。刚才说内存是慢速设备,所以需要片上缓存,但这个“慢”是相对于CPU而言的,相对于机械硬盘HDD,内存的速度可快多了。

对于磁盘的读写操作,在很久以前,读写过程需要CPU参与,后来出现了“DMA/直接内存访问"就不再需要CPU了,但即使如此,高负荷、长时间的磁盘读写也非常的耗时,因为磁盘是机械旋转部件,其读写速度相比CPU和内存条的二进制电压变化速度,那就是蒸汽机和火箭速度的差别。

为了加快数据的读写速度,在磁盘和内存之间也插入一层Cache(Windows在内存里划分出一块区域作为Cache,硬盘也有板载Cache。)

写入数据的时候先写入到Cache里;因为Cache很快,所以数据很快就写入。

比方说,1G的数据,如果直接写入硬盘需要10秒,但写入Cache(也就是系统内存)只需要1秒。

这样一来用户就有了系统速度很快的“幻觉”。但这只是障眼法,数据暂存在Cache里并没有被真正写入磁盘,等系统空闲的时候再慢慢写入。

同理,在读数据的时候,除了所需的数据,还有一堆目前不需要的数据也都被读出来放到内存的Cache里。下次再读的时候,如果恰巧Cache里有所需的数据就可直接读入(命中),这就避免了从慢速的HDD读数据的尴尬。用户的体验同样也是速度很快。(同样不会100%命中,因为RAM的容量远小于硬盘容量)

<img src="https://pic2.zhimg.com/50/v2-ca8cadd1052a5d261c02c02c2792bdf6_hd.jpg" data-caption="" data-size="normal" data-rawwidth="543" data-rawheight="209" class="origin_image zh-lightbox-thumb" width="543" data-original="https://pic2.zhimg.com/v2-ca8cadd1052a5d261c02c02c2792bdf6_r.jpg">

PC有16G的内存,磁盘Cahce占用了3.59G,这是动态的,会自动调整大小

<img src="https://pic3.zhimg.com/50/v2-9a784b47e3c5f3ad405f627df6889a9c_hd.jpg" data-caption="" data-size="normal" data-rawwidth="291" data-rawheight="63" class="content_image" width="291">

硬盘也内置了Cache。某品牌硬盘的广告强调了大缓存的优势

以上举了3个栗子:蓄水池、CPU的Cache、磁盘的Cache
Cache是为了解决什么问题?高速与低速设备通信时,因为低速设备响应缓慢的原因,造成高速设备的性能优势无法发挥,所以需要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的空间

再以编程为例,假设要实现一个功能:接受用户键入的字符串,并赋值给一个字符串变量
其过程如下:
1:在内存中开辟一个”键盘缓冲区“接受用户键入的字符串
2:把缓冲区中的字符串copy到程序中定义的字符串变量指向的内存空间(也就是赋值过程)
也就是说,为了完成最终目标:把字符串放入字符串变量指向的空间,需要暂时把字符串放入“键盘缓冲区”的空间。

所以来比较:

cache:缓存:表示已读取的数据(快取):待会儿还用得着,先别扔。

实现数据的重复使用,速度慢的设备需要通过缓存将经常要用到的数据缓存起来,缓存下来的数据可以提供高速的传输速度给速度快的设备。例如:将硬盘中的数据读取出来放在内存的缓存区中,这样以后再次访问同一个资源,速度会快很多。

buffer:缓冲:表示要写入的数据 (缓存):你先等等,抢坟去吗?

将数据缓冲下来,解决速度慢和快的交接问题;速度快的需要通过缓冲区将数据一点一点传给速度慢的区域。例如:从内存中将数据往硬盘中写入,并不是直接写入,而是缓冲到一定大小之后刷入硬盘中。

萌新扫盲3—Cache还是Buffer?区别何在相关推荐

  1. mysql中的cache和buffer_mysql Cache和Buffer区别有哪些?

    mysql Cache和Buffer区别有: Buffer的核心作用是用来缓冲,缓和冲击.比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛.用个buffer ...

  2. 萌新扫盲9—端口号的故事

    在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型. 物理端口指的是物理存在的端口,如ADSL Modem.集线器.交换机.路由器上用 于连接其他网络设备的接口,如RJ-45端口.SC端口等 ...

  3. Cache 和 Buffer 有什么区别

    Cache 和 Buffer 有什么区别 转载 :talkwithtrend : https://mp.weixin.qq.com/s/YsEOBVS7fXgrGXnXH1I0MQ Cache和Buf ...

  4. 缓存与缓冲的区别 Difference Between Cache and Buffer

    2019独角兽企业重金招聘Python工程师标准>>> Cache vs Buffer Both cache and buffer are temporary storage are ...

  5. 萌新食用:Verilog中wire和reg数据类型的区别

    萌新食用:Verilog中wire和reg数据类型的区别 最近恰好在学习数电相关知识扯到Verilog中的wire与reg类型数据的区别: 总的来说,其实就一句话:wire相当于物理连线,而reg相当 ...

  6. Cache 和 Buffer 有什么区别?

    Cache和Buffer是两个不同的概念,简单的说,Cache是加速"读",而buffer是缓冲"写",前者解决读的问题,保存从磁盘上读出的数据,后者是解决写的 ...

  7. Linux系统中的Page cache和Buffer cache

    Free命令显示内存 首先,我们来了解下内存的使用情况: Mem:表示物理内存统计 total:表示物理内存总量(total = used + free) used:表示总计分配给缓存(包含buffe ...

  8. Cache 和 Buffer 都是缓存,主要区别是什么?

    链接地址:https://www.zhihu.com/question/26190832 作者:知乎用户 链接:https://www.zhihu.com/question/26190832/answ ...

  9. linux内核学习6:Linux的CPU高速缓存cache和页高速缓存cache,buffer

    一.CPU高速缓存(cache) 参考:https://blog.csdn.net/u014470361/article/details/80060701 参考:https://blog.csdn.n ...

最新文章

  1. xm console无法联接guest问题的解决
  2. 人人可以理解的区块链100问——区块链记录哪些信息
  3. 系统思考与《第五项修炼》
  4. discuz集思街淘宝客模板
  5. 【LeetCode】【HOT】19. 删除链表的倒数第 N 个结点(双指针)
  6. 初探内核之《Linux内核设计与实现》笔记上
  7. HDFS的架构和设计要点
  8. 查看文件md5_了解 | Mongodb 文件存储之 GridFs
  9. sql server 2005_全文目录
  10. java爬虫新闻网站_java爬虫 之 搜狐新闻爬虫(一)
  11. seo搜索引擎优化-SEO优化教程附关键词工具以及文章采集软件
  12. python爬虫入门爬取lpl选手价值排行榜
  13. 她笔下的水墨世界令人赞叹,中国风海报沉浸式国风体验
  14. MySQL 语法整理(2)
  15. mysql-8.0.13-winx64安装卸载配置使用教程
  16. 移动硬盘里文件夹不见了 内容还在 不显示
  17. CSP 201609-3 炉石传说(C++)
  18. 2022T电梯修理考试题库及模拟考试
  19. 今天一个客户公司里要让一台电脑通网
  20. 计算机里面有鬼的恐怖游戏,胆小勿入!盘点史上十大最恐怖电脑游戏

热门文章

  1. 他博士毕业论文写了1255页!28岁评教授,38岁当院士!
  2. 笔记本屏幕测试linux,Screen Item Detector
  3. 【《OpenCV3编程入门》内容简介勘误配套源代码下载
  4. 第一章搭建uni-app 记账小程序
  5. CALayer 2 详解 -----转自李明杰
  6. python绘制色块图_在Python tu中用色块和数字绘制板
  7. 2021-7-12 js解析json时取出数据为undefined
  8. 五一不想被堵建议你去渭南周边清净人少的地方去游玩
  9. numpy数组(无冒号,单冒号,双冒号)的含义
  10. tp php cms,基于 tp3.2 的 CMS 管理系统 thinkphpcms