buffer和cache的区别是什么?
【总结】
概念:cache和buffer都是内存模块,只是作用不同所以名称不同,主要是为了解决磁盘IO慢的问题,借用内存来储存磁盘IO需要的数据。
一句话的描述:
buffer就是记录修改的信息,用于系统写入数据到磁盘。
cache就是记录磁盘的信息,用于系统从磁盘读数据。
在操作系统中的角色:
buffer:即 os =》修改操作想要落地到盘 =》先全部记录到 buffer =》根据压力和同步策略 批量持久化到磁盘(避免小而多的频繁写入磁盘,前面说了磁盘写入比内存操作慢多了)
cache:即 os =》想要读取一个文件 =》先去cache内存里面看有没有 =》没有则读取硬盘上的文件内容到 cache,有则直接读cache内存(避免小而多的频繁读磁盘,前面说了磁盘读比内存操作慢多了)
在数据库里面的角色:
buffer就是脏页、索引缓存页,定时根据数据库/os 策略来批量落盘脏页,避免小而多的频繁写入磁盘。
cache 就是查询缓存/数据缓存,以减少回表次数。
在free命令展示机器的内存消耗情况,会像这样展示
buffered 和cached本质内容有什么区别呢?
我没搞明白。我觉得需要追根溯源会更加理解本质。
英文是这样解释
A buffer is something that has yet to be "written" to disk. 这些数据准备写到磁盘的,但还没有写到磁盘,缓存在内存中。
之所以有这样的机制,因为频繁地写入磁盘,会造成磁盘i/0,所以一般数据不会马上写入到磁盘去,而是定期积累到一定量后写入磁盘去。
buffer的英文本意是缓冲器,缓冲一下,不要马上写入到磁盘,冲击磁盘。
这个buffer大小由什么设置的呢? 不知道。待补充。
A cache is something that has been "read" from the disk and stored for later use.
从磁盘上读取数据存储到内存中缓存起来,方便下一次使用。目的是避免频繁的去磁盘上读取数据,直接从内存中读取使用了。
之所以有cache,一般是对频繁使用到的数据(读的数据),进行缓存到内存。
------------------------------------------
从上面分析看,两个内存区域要解决的问题和目标都不同。一个是解决频繁读的问题。另外一个是解决频繁写入到磁盘的问题。
但相同点是:他们都是为了减少磁盘i/0次数。因为磁盘是机械性的旋转,靠磁头定位来读、写数据。频繁读、写磁盘,就会造成磁头频繁定位,这个就是磁盘i/0(数据库系统的实现里面有磁盘的原理介绍,然后专门讲解实现一个数据库系统如何针对磁盘做优化)
free命令中的used项(已经使用的内存),其实是已经包含了buffer和cache部分。
根据上面对buffer和cache的分析,buffer和cache部分实际上是可以拿来使用的内存区(都是缓存数据,释放掉这部分内存空间并不影响)
正因为这样,为了想要准确得知到底有多少可用的内存,linux的free命令,会第二列专门给出减去buffer和cache部分的统计结果来看。
第二列 :-/+ buffers/cache
显示两个值,第一个值,是used-buffers-cache的计算结果。第二个值 是used+buffers+cache的计算结果
思考
从操作系统角度来看,它只关注真正的物理内存剩余多少。所以buffer区域和cache区域它也认为不是剩余的。这没有错。操作系统关注是物理内存真实有多少。
而应用程序角度来看,它关注的是有多少物理内存是自己可以调用的。它认为buffer和cache部分也是可以拿过来用的。也没有错误。
现实中例子用什么来形象化描述呢?
一个人有多少钱,站在不同的角度算法不一样。
有人存款10万。我们只是看它真实钱有多少。那就是10万(操作系统这么认为)
而从另外一个角度,他有房子,如果需要,房子可以卖掉,卖成钱,估算一下价格。假设房子80万,那么他的钱就是80+10=90万(应用程序这么认为)
两个计算方式都没有错。角度不同。
buffer和cache,对于应用程序而言,觉得这部分是可以回收的(我需要的时候随时可以用。房子随时可以套现拿到钱使用)