194

我到处都能看到“BUFFER”这个词,但我无法理解它到底是什么。

  1. 有人可以用外行的语言解释什么是缓冲区吗?
  2. 什么时候使用?
  3. 它是如何使用的?
4

8 回答 8

358

想象一下,你正在吃碗里的糖果。你经常拿一件。为了防止碗用完,有人可能会在碗空了之前把它装满,这样当你想再吃一块时,碗里就有糖果了。

碗充当您和糖果袋之间的缓冲区。

如果您正在在线观看电影,网络服务将在接下来的 5 分钟左右将持续下载到缓冲区中,这样您的计算机就不必在观看电影时下载电影(这会导致挂起)。

于 2009-03-15T18:50:03.657 回答
115

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


如果你平均一下http://en.wiktionary.org/wiki/buffer上的定义,我想你会明白的。

为了证明我们确实“每天必须走 10 英里,想着下雪去上学”,请参阅TOPS-10 Monitor Calls Manual 第 1 卷,第 11.9 节,“使用缓冲 I/O”,书签 11-24。如果您受到噩梦的影响,请不要阅读。

于 2009-03-15T18:46:13.603 回答
24

缓冲区只是用于保存数据的一块内存。在最一般的意义上,它通常是在一个操作中加载的单个内存块,然后在一个或多个操作中清空,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) 读取的数据,直到它被写入;然后重新使用缓冲区。

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

于 2009-03-15T18:58:22.030 回答
18

缓冲区的意思是“临时存储”。缓冲区在计算中很重要,因为互连的设备和系统很少彼此“同步”,因此当信息从一个系统发送到另一个系统时,它需要等待接收系统准备好。

于 2009-03-15T19:22:05.123 回答
7

实际上,这取决于每种情况下的上下文,因为没有一个定义-但通常来说,缓冲区是临时保存某些东西的地方。我能想到的最好的现实世界比喻是等候区。计算中的一个简单示例是缓冲区指的是用于临时存储数据的 RAM 的一部分。

于 2009-03-15T18:57:18.927 回答
2

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

Buffering 有很多优点,比如它可以让事情并行发生、提高 IO 性能等。

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

C 字符缓冲区示例。

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

char *buffer2 = calloc(15, sizeof(char));
于 2009-03-15T18:53:12.260 回答
2

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

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

于 2009-06-10T07:46:37.023 回答
2

缓冲区是由硬件设备或程序进程共享的数据区域,它们以不同的速度或不同的优先级运行。缓冲区允许每个设备或进程在不被另一个阻止的情况下运行。为了使缓冲区有效,缓冲区的大小以及将数据移入和移出缓冲区的算法。

缓冲区是一个“中点保持位置”,但它的存在与其说是为了加快一项活动的速度,不如说是为了支持不同活动的协调。

该术语用于编程和硬件中。在编程中,缓冲有时意味着需要从其最终预期位置筛选数据,以便在将其移动到常规文件或数据库之前可以对其进行编辑或以其他方式处理。

于 2014-10-11T04:51:53.110 回答