作者:沈万马
链接:https://www.zhihu.com/question/26190832/answer/146259979
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
俩英文单词,不先看看本义吗?虽然都是抽象单词,但在各个地方都有具象的应用。
Buffer常见的是这个:
对,就是铁道端头那个巨大的弹簧一类的东西。作用是万一车没停住,撞弹簧上减速慢,危险小一些。叫缓冲。
Cache常见的是这个:
(来源:https://upload.wikimedia.org/wikipedia/commons/6/68/Bear_caches.jpg)
没错,就是一种保管箱。看到右边那个被锈掉的Food Cache没?这是部署在森林里的存应急物资的保管箱。功能是把你需要用的东西放在更容易拿到的地方。虽然常用准确翻译叫缓存,但个人以为意思表达的不对,丢了一半的功能。台湾的翻译更好,叫快取。
相信看完这些应该不用我说区别了?
哎呀还是卖弄一下吧。
简单说,Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓和了冲击。
Cache的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。
所以,如果你注意关心过存储系统的话,你会发现硬盘的读写缓冲/缓存名称是不一样的,叫write-buffer和read-cache。很明显地说出了两者的区别。
当然很多时候宏观上说两者可能是混用的。比如实际上memcached很多人就是拿来读写都用的。不少时候Non-SQL数据库也是。严格来说,CPU里的L2和L3 Cache也都是读写兼用——因为你没法简单地定义CPU用它们的方法是读还是写。硬盘里也是个典型例子,buffer和cache都在一块空间上,到底是buffer还是cache?
不过仔细想一下,你说拿cache做buffer用行不行?当然行,只要能控制cache淘汰逻辑就没有任何问题。那么拿buffer做cache用呢?貌似在很特殊的情况下,能确定访问顺序的时候,也是可以的。简单想一下就明白——buffer根据定义,需要随机存储吗?一般是不需要的。但cache一定要。所以大多数时候用cache代替buffer可以,反之就比较局限。这也是技术上说cache和buffer的关键区别。
——————
补充1:不要误解Buffer就是用来写的,Cache就是用来读的。读可以用Buffer吗?当然可以,比如你想一批一批地处理读取而非有啥处理啥的时候,就可以用读buffer。写当然也可以用cache,比如你的写入有很高的随机性的时候。具体什么场景用Buffer什么场景用Cache要根据场景的具体需要决定。
补充2:不要误解Cache或Buffer就一定是内存或者存在什么高速媒介上的东西。只要相对高速即可。我完全可以在硬盘上存Cache,比如有些游戏会在运行时建立预编译的shader(暴露年龄),这本质上就是一种cache,它存在速度缓慢的硬盘上,因为读硬盘依旧比重新编译要快。Buffer也同理,例如NTFS文件系统自己就有Logging Buffer,这个甚至明确拒绝放在任何易失缓存里。
相信看完这些应该不用我说区别了?
哎呀还是卖弄一下吧。
简单说,Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓和了冲击。
Cache的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。
所以,如果你注意关心过存储系统的话,你会发现硬盘的读写缓冲/缓存名称是不一样的,叫write-buffer和read-cache。很明显地说出了两者的区别。
当然很多时候宏观上说两者可能是混用的。比如实际上memcached很多人就是拿来读写都用的。不少时候Non-SQL数据库也是。严格来说,CPU里的L2和L3 Cache也都是读写兼用——因为你没法简单地定义CPU用它们的方法是读还是写。硬盘里也是个典型例子,buffer和cache都在一块空间上,到底是buffer还是cache?
不过仔细想一下,你说拿cache做buffer用行不行?当然行,只要能控制cache淘汰逻辑就没有任何问题。那么拿buffer做cache用呢?貌似在很特殊的情况下,能确定访问顺序的时候,也是可以的。简单想一下就明白——buffer根据定义,需要随机存储吗?一般是不需要的。但cache一定要。所以大多数时候用cache代替buffer可以,反之就比较局限。这也是技术上说cache和buffer的关键区别。
——————
补充1:不要误解Buffer就是用来写的,Cache就是用来读的。读可以用Buffer吗?当然可以,比如你想一批一批地处理读取而非有啥处理啥的时候,就可以用读buffer。写当然也可以用cache,比如你的写入有很高的随机性的时候。具体什么场景用Buffer什么场景用Cache要根据场景的具体需要决定。
补充2:不要误解Cache或Buffer就一定是内存或者存在什么高速媒介上的东西。只要相对高速即可。我完全可以在硬盘上存Cache,比如有些游戏会在运行时建立预编译的shader(暴露年龄),这本质上就是一种cache,它存在速度缓慢的硬盘上,因为读硬盘依旧比重新编译要快。Buffer也同理,例如NTFS文件系统自己就有Logging Buffer,这个甚至明确拒绝放在任何易失缓存里。
相关推荐
Buffer Cache与Cache的区别在于,Buffer Cache特指Oracle数据库中的数据缓冲区,主要优化的是磁盘I/O,而Cache则涵盖了从硬件层面到操作系统层面的各种缓存机制,包括CPU缓存、文件系统的Page Cache等,其目标是提升...
Buffer 和 Cache 的主要区别在于其作用和特点。Buffer 是一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域,旨在减少进程之间的等待时间。Cache 则是一个高速缓存,旨在提高 CPU 的操作效率。 在...
### Linux操作系统中内存buffer和cache的区别 #### 一、引言 在Linux操作系统中,内存管理是一项关键的技术,它直接影响到系统的性能和稳定性。本文将详细介绍Linux系统中内存buffer和cache的区别及其工作原理,...
Buffer Cache深度分析涉及到内存管理、缓存命中率优化、并发控制等多个方面,是理解Java数据库连接(JDBC)和数据库性能优化的关键。 Buffer Cache的主要功能是将频繁访问的数据页存储在内存中,减少对硬盘I/O操作...
### Linux内存管理中的Buffer与Cache区别详解 #### 一、引言 在现代操作系统中,内存管理是一项极其重要的任务,特别是在Linux这样的多用户多任务环境中。Linux系统在内存管理方面采取了许多高效的策略来提高系统...
Buffer Cache 的内存结构主要包括 Hash Bucket 和 Buffer Header。 - **Hash Bucket**: 使用 Hash 算法将数据块映射到不同的 Hash Bucket 中。每个 Hash Bucket 是一组 Buffer Header 的集合。 - **Buffer Header**...
为了实现高效的缓冲区管理,Buffer Cache主要包括三个关键的数据结构: 1. **HashBucket & HashChain List** - **作用**:用于快速定位数据块。 - **原理**:通过内部哈希算法,将Buffer Cache中的所有缓冲区分发...
Oracle内存主要分为系统全局区(SGA)和程序全局区(PGA),其中SGA又包含数据缓冲区(Data Buffer Cache)、日志缓冲区(Redo Log Buffer)和共享池(Shared SQL Pool)。数据缓冲区是SGA中最重要的部分,也就是Buffer Cache...
Linux内存管理是操作系统的核心组成部分,尤其在服务器环境中,理解Swap和Buffer Cache机制至关重要。Swap空间是Linux实现虚拟内存的关键,它允许系统将物理内存中暂时不用的数据存储到硬盘上,以此扩展内存容量。当...
#### 一、为什么了解缓存(cache)和写缓冲(write buffer)很重要? 在现代计算机体系结构中,缓存和写缓冲扮演着至关重要的角色,特别是对于高性能计算设备而言,如ARM处理器。理解这些概念可以帮助程序员更好地优化...
4. **Cache Buffer Chain Latch**:每个哈希桶都有一个缓存缓冲区链路锁,用于控制对Hash Chain的并发访问。当多个并发事务尝试访问同一数据块时,这些锁确保了数据的一致性和完整性。 5. **_db_block_hash_buckets...
数据库的缓存策略主要包括Query Cache和Data Buffer。Query Cache存储SQL查询结果,避免重复计算,但需注意调整大小以避免内存浪费。Data Buffer是数据库数据在内存中的缓存,其大小直接影响数据库性能,通常建议...
监控数据库缓存状态至关重要,MySQL提供了一系列命令和工具,如`show status like 'Qcache%'`、`show innodb status\G`、mysqlreport和innotop,用于查看Query Cache和InnoDB Buffer的状态,确保缓存效果最佳。...
本文档提供了一项针对 Linux 缓冲区缓存(Buffer Cache)在运行 Oracle OLTP(在线事务处理)工作负载时的性能分析研究。通过一系列测试收集了缓冲区缓存命中率及测试运行时间数据,为理解该系统复杂操作提供了宝贵...
虽然Buffer和Cache都旨在提高系统的性能,但它们的操作对象和目标不同: - **Buffer(缓冲)**:主要用于提高内存和I/O设备(如硬盘)之间的数据交换速度。Buffer通常是操作系统的一部分,用于缓解高速内存与低速I/...
如果该 Latch 竞争激烈,可以通过增大 Buffer Cache、修改参数_db_block_lru_latches、使用多缓冲池技术等方法来解决。 Oracle Buffer Cache 是 Oracle 数据库中的一种重要机制,用于提高数据库的性能。通过理解 ...
2. **数据库缓存**:数据库系统通常有自己的缓存机制,如MySQL的Query Cache和Data Buffer,以减少磁盘I/O操作,提高查询效率。 3. **应用程序缓存**:应用程序可以使用自己的缓存策略,减少对数据库的直接查询,如...
【缓存和缓冲区在ARM920T处理器中的应用】 在ARM920T处理器中,缓存和缓冲区是提升系统性能的关键组件。它们有效地减少了对主存的访问次数,降低了延迟,并优化了带宽利用率。以下是关于ARM920T处理器中缓存和缓冲...
此外,理解Linux内核的缓冲区缓存机制(比如Page Cache和DMA Buffer)也是至关重要的,这些机制可以帮助系统更高效地处理I/O操作,减少CPU与外设之间的交互次数,从而提高整体性能。 总之,Linux缓冲区是优化系统...
本章节主要讲解了Linux内核中的文件系统缓冲区,包括缓冲区、缓存、DCache、Inode Cache、Page Cache、Buffer Cache等概念的定义、作用、区别和实现机理。 缓冲区(Buffer)是内存空间的一部分,预留了一定的存储...