1. Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,由于CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而 Cache保存着CPU刚用过的数据或循环使用的部分数据,这时从Cache中读取数据会更快,减小了CPU等待的时间,提升了系统的性能。linux
Cache并非缓存文件的,而是缓存块的(块是I/O读写最小的单元);Cache通常会用在I/O请求上,若是多个进程要访问某个文件,能够把此文件读入Cache中,这样下一个进程获取CPU控制权并访问此文件直接从Cache读取,提升系统性能。编程
2. Buffer:缓冲区,用于存储速度不一样步的设备或优先级不一样的设备之间传输数据;经过buffer能够减小进程间通讯须要等待的时间,当存储速度快的设备与存储速度慢的设备进行通讯时,存储慢的数据先把数据存放到buffer,达到必定程度存储快的设备再读取buffer的数据,在此期间存储快的设备CPU能够干其余的事情。缓存
Buffer:通常是用在写入磁盘的,例如:某个进程要求多个字段被读入,当全部要求的字段被读入以前已经读入的字段会先放到buffer中。网络
假设某地发生了天然灾害(好比地震),居民缺衣少食,因而派救火车去给若干个居民点送水。
救火车到达第一个居民点,开闸放水,老百姓就拿着盆盆罐罐来接水。
假如说救火车在一个居民点停留100分钟放完了水,而后从新储水花半个小时,再开往下一个居民点。这样一个白天来来来回回的,也就是4-5个居民点。
但咱们想一想,救火车是何等存在,若是把水龙头彻底打开,其强大的水压能轻易冲上10层楼以上, 10分钟就能够把水所有放完。但由于居民是拿盆罐接水,100%打开水龙头那就是给人洗澡了,因此只能打开一小部分(好比10%的流量)。但这样就下降了放水的效率(只有原来的10%了),10分钟变100分钟。
那么,咱们是否能改进这个放水的过程,让救火车以最高效率放完水、尽快赶往下一个居民点呢?
方法就是:在居民点建蓄水池。
救火车把水放到蓄水池里,由于是以100%的效率放水,10分钟结束而后走人。居民再从蓄水池里一点一点的接水。
咱们分析一下这个例子,就能够知道Cache的含义了。
救火车要给居民送水,居民要从救火车接水,就是说居民和救火车之间有交互,有联系。
但救火车是“高速设备”,居民是“低速设备”,低速的居民跟不上高速的救火车,因此救火车被迫下降了放水速度以适应居民。
为了不这种状况,在救火车和居民之间多了一层“蓄水池(也就是Cache)”,它一方面以100%的高效和救火车打交道,另外一方面以10%的低效和居民打交道,这就解放了救火车,让其以最高的效率运行,而不被低速的居民拖后腿,因而救火车只须要在一个居民点停留10分钟就能够了。
因此说,蓄水池是“活雷锋”,把高效留给别人,把低效留给本身。把10分钟留给救火车,把100分钟留给本身。ide
从以上例子能够看出,所谓Cache,就是“为了弥补高速设备和低速设备之间的矛盾”而设立的一个中间层。由于在现实里常常出现高速设备要和低速设备打交道,结果被低速设备拖后腿的状况。性能
以PC为例。CPU速度很快,但CPU执行的指令是从内存取出的,计算的结果也要写回内存,但内存的响应速度跟不上CPU。CPU的Cache,能够有好几层,并且还分数据Cache和指令Cache操作系统
磁盘缓存也是同样,刚才说内存是慢速设备,因此须要片上缓存,但这个“慢”是相对于CPU而言的,相对于机械硬盘HDD,内存的速度可快多了。PC有16G的内存,磁盘Cahce占用了3.59G,这是动态的,会自动调整大小.net
硬盘也内置了Cache。某品牌硬盘的广告强调了大缓存的优点翻译
以上举了3个栗子:蓄水池、CPU的Cache、磁盘的Cache
Cache的存在是为了解决什么问题?速度太慢了,要加快速度!设计
那么buffer呢? 请容许我再次举起栗子。
好比说吐鲁番的葡萄熟了,要用大卡车装葡萄运出去卖
果园的姑娘采摘葡萄,固然不是前手把葡萄摘下来,后手就放到卡车上,而是须要一个中间过程“箩筐”:摘葡萄→放到箩筐里→把箩筐里的葡萄倒入卡车。
也就是说,虽然最终目的是“把葡萄倒入卡车”,但中间必需要通过“箩筐”的转手,这里的箩筐就是Buffer。是“暂时存放物品的空间”。
注意2个关键词:暂时,空间
再换句话说,为了完成最终目标:把葡萄放入卡车的空间,须要暂时把葡萄放入箩筐的空间。
以BT为例,BT下载须要长时间的挂机,电脑就有可能24小时连轴转,但BT下载的数据是碎片化的,体如今硬盘写入上也是碎片化的,由于硬盘是机械寻址器件,这种碎片化的写入会形成硬盘长时间高负荷的机械运动,形成硬盘过早老化损坏,当年有大量的硬盘由于BT下载而损坏。
因而新出的BT软件在内存里开辟了Buffer,数据暂时写入Buffer,攒到必定的大小(好比512M)再一次性写入硬盘,这种“化零为整”的写入方式大大下降了硬盘的负荷。
这就是:为了完成最终目标:把数据写入硬盘空间,须要暂时写入Buffer的空间。
再以编程为例,假设要实现一个功能:接受用户键入的字符串,并赋值给一个字符串变量
其过程以下:
1:在内存中开辟一个”键盘缓冲区“接受用户键入的字符串
2:把缓冲区中的字符串copy到程序中定义的字符串变量指向的内存空间(也就是赋值过程)
也就是说,为了完成最终目标:把字符串放入字符串变量指向的空间,须要暂时把字符串放入“键盘缓冲区”的空间。
以上举的3个栗子:箩筐、BT的Buffer,键盘缓冲区的Buffer
Buffer的存在是为了解决什么问题?找个临时的存储空间!
监控linux资源时,在输入top命令后,发现内存相关MEM和SWAP的buffer与Cache,顺便研究了一下。
什么是Cache?什么是Buffer?两者的区别是什么?
Buffer和Cache的区别 buffer与cache操做的对象就不同。
一、buffer(缓冲)是为了提升内存和硬盘(或其余I/O设备)之间的数据交换的速度而设计的。
二、cache(缓存)
从CPU角度考虑,是为了提升cpu和内存之间的数据交换速度而设计的,例如日常见到的一级缓存、二级缓存、三级缓存。 cpu在执行程序所用的指令和读数据都是针对内存的,也就是从内存中取得的。因为内存读写速度慢,为了提升cpu和内存之间数据交换的速度,在cpu和内存之间增长了cache,它的速度比内存快,可是造价高,又因为在cpu内不能集成太多集成电路,因此通常cache比较小,之后intel等公司为了进一步提升速度,又增长了二级cache,甚至三级cache,它是根据程序的局部性原理而设计的,就是cpu执行的指令和访问的数据每每在集中的某一块,因此把这块内容放入cache后,cpu就不用在访问内存了,这就提升了访问速度。固然若cache中没有cpu所须要的内容,仍是要访问内存的。
从内存读取与磁盘读取角度考虑,cache能够理解为操做系统为了更高的读取效率,更多的使用内存来缓存可能被再次访问的数据。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操做集中进行,减小磁盘碎片和硬盘的反复寻道,从而提升系统性能。linux有一个守护进程按期清空缓冲内容(即写入磁盘),也能够经过sync命令手动清空缓冲。简单来讲,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。 buffer是由各类进程分配的,被用在如输入队列等方面。一个简单的例子如某个进程要求有多个字段读入,在全部字段被读入完整以前,进程把先前读入的字段放在buffer中保存。cache常常被用在磁盘的I/O请求上,若是有多个进程都要访问某个文件,因而该文件便被作成cache以方便下次被访问,这样可提升系统性能。