IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Buffer和cache的区别是什么?

delphij's Chaos 2009-12-14 22:50:29 累计浏览 7,940 次
本机暂存

    buffer和cache是两个经常被混为一谈的概念。从直观上说,两者都具备改善系统 I/O 吞吐量的能力,但是这两个概念是有区别的,其提高系统I/O吞吐量的原因也不尽相同。

    cache改善系统性能的主要原因是数据访问的 局部性,即,通常应用程序在一段时间内操作的数据集的某个有限的部分,通常是很小的一部分。硬件实现的cache通常会只使用一小块(与主存相比)访问速度很快,但相对比较昂贵的存储部件,并放置于距离CPU较近的位置。

    buffer改善系统性能的主要原因是减少不必要的状态切换和设备I/O。由于制造工艺等个方面的原因,系统中不同部件的速度往往是不一样的,一次进行批量的操作(例如,预先读取,或者将写数据凑成一个整数之后再写),往往要比到需要时等待这些操作完成要节省时间,并且有效地降低状态切换导致的开销。

    还有一个比较显著的区别是,cache通常是硬件或OS提供,用户程序不需要(多数情况下也没有办法)为其分配存储的机制,通常它在使用者,如用户程序看来是透明的,它属于提供cache的一方而不是其使用者;而buffer往往是由用户程序知道并且与OS共享(换言之,用户程序需要分配一块内存,并告诉OS这块内存将要用于某种操作),或由OS分配,并在主机和外设之间共享(例如网卡的DMA buffer),在使用者看来它通常不是透明的,这些内存往往属于控制内存的程序,如用户程序,或OS,而不是向其传递数据的OS,或硬件。

    不过,这个区别主要是传统意义上的cache。最近几年引入的一些新概念,特别是Internet cache并不能用这种方法来区分。我认为最关键的区别其实在于,buffer主要作用是在于减少实际的I/O操作次数,即,将多次操作尽量合并成一次的成批操作,通常其中的数据在操作完成之后,buffer不会被继续使用;而cache的主要作用在于更好地利用局部性原理,减少不必要的I/O,避免代价昂贵(例如,速度很慢)的I/O操作。

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 浅析http协议、cookies和session机制、浏览器缓存 (累计阅读 17,446)
  2. 淘宝图片存储架构 (累计阅读 10,960)
  3. TT的作者出新作品鸟:kyoto tycoon (累计阅读 7,953)
  4. 学习:一个并发的Cache (累计阅读 6,103)
  5. PHP 性能优化技巧-google (累计阅读 6,042)
  6. fatcache源码浅析 (累计阅读 6,052)
  7. 分享会-高性能nosql数据库redis (累计阅读 5,733)
  8. [调优] Squid 不同版本的性能对比 (累计阅读 5,591)
  9. memcached 源码阅读笔记 (累计阅读 5,401)
  10. Memcached and MySQL (累计阅读 4,492)