缓冲区是什么意思?

235

我看到"BUFFER"这个词无处不在,但我无法掌握它的确切含义。

  1. 请用通俗易懂的语言解释一下什么是缓冲区?
  2. 什么时候会使用它?
  3. 如何使用它?

我注意到“缓冲区”在名称上有轻微的变化,这些变化往往基于物理内存所持有的内容以及其用途而改变。例如,“图形缓冲区”是视频内存的char数组,而网络缓冲区可能位于普通RAM中。我不确定这是否是标准还是偶然发生的。类似于Ailayna在最后提供的答案。 - Stephen J
9个回答

440

想象一下你正在从一个碗里吃糖果。你每次拿一颗。为了防止碗里的糖果被吃光,有人可能会在碗快空时加满它,这样当你想再拿一颗糖果时,碗里面还有。

碗就像是你和糖果袋之间的缓冲器。

如果你在线观看电影,网络服务会不断地将接下来的大约5分钟内容下载到缓冲区,这样你的电脑就不必在你观看时下载整个电影(这会导致卡顿)。


158
+1:当生产者和消费者的操作速度不同时,需要缓冲区。糖果通常是批量生产但分批次消费的——从制造商到口中整个供应链都是一系列缓冲区。 - S.Lott
48
最好的比喻了。让我渴望吃糖。 - Kyle Macey
这里的Web服务是什么?缓冲区在哪里?Web服务是电影主机吗? - Jwan622
坚实的定义。我想这就是为什么当视频冻结时我们会说它正在缓冲,而在观看电影时进度条正在显示的原因。 - Red M
3
非常好,可行而简单。 - Jonas Grønbek

136

“缓存”是一个非常通用的术语,不仅限于信息技术或计算机科学。它是一个临时存储的地方,以缓解输入速度和输出速度之间的差异。当生产者比消费者更快时,生产者可以继续将输出存储在缓存中。当消费者准备好时,它可以从缓存中读取。缓冲区在中间起到了连接两者之间差距的作用。


如果你平均一下http://en.wiktionary.org/wiki/buffer上的定义,我认为你就会明白了。
要证明我们真的“每天都不得不走过雪地走10英里去上学”,请参见TOPS-10 Monitor Calls Manual Volume 1,第11.9节,“使用缓冲I/O”,书签为11-24。如果你容易做噩梦,不要阅读。

1
+1 我更喜欢这个解释。虽然我很喜欢糖果,但在我看来,糖果碗的例子有点牵强。 - Tim Frey
15
是的,“一个用于暂时存放东西的地方,以缓解输入速度和输出速度之间的差异”这句话完美地概括了它的含义。 - chimp
1
谢谢您的简单解释。然而,附加的PDF链接已经失效了。 - hassan
当消费者加速时,它可以从缓冲区读取。 我很难理解这句话。它真的需要等待消费者加速才能开始从缓冲区读取吗?无论速度如何,一旦缓冲区满了,它不会立即开始读取吗? - D_S_X
@V_S_X 我编辑了我的答案,以明确消费者实际上不需要加速。事实上,消费者可以继续缓慢或更慢,直到缓冲区填满。但是,消费者在读取之前不必等待缓冲区被填满。它只是按照自己想要的速度阅读。如果生产者和消费者速度之间的差异太大,则缓冲区可能会溢出。 - John Saunders

30

缓冲区(Buffer)就是一块用于存储数据的内存块。一般而言,它通常是一个内存块,在一次操作中被加载,并在一个或多个操作中被清空,就像Perchik所说的“糖果碗”示例。例如,在C程序中,你可能会有以下代码:

#define BUFSIZE 1024
char buffer[BUFSIZE];
size_t len = 0;

// ... later
while((len=read(STDIN, &buffer, BUFSIZE)) > 0)
    write(STDOUT, buffer, len);

这是 cp(1) 的极简版本。使用缓冲数组存储被 read(2) 读取的数据,直到写入完成; 然后重新使用该缓冲区。

还有一些更复杂的缓冲方案,例如使用环形缓冲区,其中使用有限数量的缓冲区,一个接一个地使用;一旦所有缓冲区都已满,索引“回绕”,以便重新使用第一个缓冲区。


23

缓冲区意味着“临时存储”。在计算机中,缓冲区非常重要,因为互联的设备和系统很少与彼此“同步”,所以当信息从一个系统发送到另一个系统时,它需要等待接收方系统准备好。


8

实际上,这取决于每种情况的上下文,因为没有一个确切的定义。但是通常来讲,缓冲区是一个暂时存放东西的地方。我能想到的最好的现实世界类比就是等候区。在计算机中,一个简单的例子是当缓冲区指的是用于临时存储数据的RAM的一部分。


3
缓冲区是由硬件设备或程序进程共享的数据区域,这些设备或进程以不同的速度或具有不同的优先级运行。缓冲区允许每个设备或进程在不被其他设备或进程阻塞的情况下运行。为了使缓冲区有效,需要考虑缓冲区的大小和移动数据进出缓冲区的算法。
缓冲区是一种“中间暂存区”,存在的目的不是为了加速活动的速度,而是为了支持不同活动的协调。
这个术语既用于编程又用于硬件。在编程中,缓冲有时意味着需要从最终预定的位置筛选数据,以便在将其移动到常规文件或数据库之前进行编辑或其他处理。

3
一个缓冲区是“用于临时存储某物,以减轻输入速度和输出速度之间差异”的说法是准确的,可以将其视为更加“通俗易懂”的理解方式。
“缓冲”,这个动词,已经进入了日常词汇。例如,当网络连接缓慢并且Netflix视频中断时,我们甚至听到父母说,“给它一点时间来缓冲”。
他们的意思是,“暂停;允许更多的视频下载到内存中;然后我们可以观看而不会停止或跳过”。
考虑到生产者/消费者类比,Netflix正在制作视频,观众正在消费(观看)它。计算机上一个额外下载的视频数据临时存储的空间就是缓冲区。
视频进度条可能是最好的视觉示例:

Video progress bar with grey buffered video content

那个视频的长度是5分钟零5秒。白色部分代表整个视频的播放时间(如果你还没有开始观看,它将会是一整块白色)。紫色部分代表我已经观看了10秒钟的视频。
灰色部分是缓冲区,是当前下载到内存的视频数据,可以在本地使用。换句话说,即使你的网络连接中断,你仍然可以观看已经缓冲的部分。

2

缓存是指在内存(RAM/磁盘)中,临时存储可以进行处理的数据的临时变量(许多编程语言都有)。

“缓冲区”是一个非常普通的术语,并不特定于IT或CS。它是一个临时存储某些东西的地方,以减轻输入速度和输出速度之间的差异。当生产者比消费者更快时,生产者可以继续将输出存储在缓冲区中。当消费者加快时,它可以从缓冲区中读取。缓存是在中间的桥梁,以缩小差距。


2

缓冲区是内存(RAM/磁盘)中的临时占位符(许多编程语言中的变量),可以在其中转储数据,然后进行处理。

缓冲的许多优点,如允许并行操作,提高IO性能等。

如果不正确使用,它也有许多缺点,例如缓冲区溢出,缓冲区下溢等。

C语言字符缓冲区示例。

char *buffer1 = calloc(5, sizeof(char));

char *buffer2 = calloc(15, sizeof(char));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接