0

我是 C++ 新手,通过 Andrew Koenig 和 Barbara E. Moo 的 Accelerated C++ 学习。

我无法理解 C++ 中缓冲区的概念,正如书中所说“大多数系统都需要花费大量时间将字符写入输出设备,无论要写入多少字符。避免写入响应的开销对于每个输出请求,库使用缓冲区来累积要写入的字符,并仅在必要时通过将其内容写入输出设备来刷新缓冲区。通过这样做,它可以将多个输出操作组合成一次写入。”

为什么大多数系统要花费大量时间将字符写入输出设备?这个缓冲区是什么,我们为什么需要它?为什么我们需要刷新缓冲区?

4

7 回答 7

3

有多种原因导致系统花费大量时间进行 I/O 操作:设备可能很慢(硬盘驱动器),可能需要在写入之前和/或之后执行各种操作等。

然后,缓冲区通过进行更大但更不频繁的读/写来减少与设备的交互次数。然后,它减少了执行操作所需的开销(在硬盘驱动器的情况下,您将希望不经常写入大块数据,而不是频繁写入小块,因为它需要查找写入位置等) .

此外,使用缓冲区,您甚至可以控制何时完成 I/O 操作,这在特定情况下可能会很有趣(例如,在实时应用程序中,您需要避免 I/O 操作,而您正在运行代码的时间受限部分,将数据存储在缓冲区中,并且只有在退出代码的时间受限部分后才执行 I/O 操作)。

于 2013-05-15T09:09:49.320 回答
2

为什么大多数系统要花费大量时间将字符写入输出设备?

因为大多数设备通过总线与 CPU 分开,因此发送数据比写入 CPU 寄存器或(缓存)内存要慢得多。许多设备涉及移动部件(旋转盘或电动激光器或其他),这些部件再次慢得多。

这个缓冲区是什么,我们为什么需要它?

这是一块内存,我们可以非常快速地将单个字符写入其中,然后稍后将它们全部发送到设备。通常,这比单独发送每个字符更有效(通常效率更高)。

例如,存储设备通常一次只能读取和写入相当大的数据块;通常,几千字节。所以写单个字符需要读取一个块,修改一个字符并写回整个块;而刷新更大的缓冲区可能只需要写入每个块一次。

为什么我们需要刷新缓冲区?

因为如果数据留在缓冲区中,它永远不会到达设备。

于 2013-05-15T09:29:16.990 回答
1

例如,输出设备可能是硬盘,写入硬盘涉及移动写入头并等待盘片旋转到正确的位置。对写入文件的每个字符都这样做会非常缓慢。

缓冲区是准备写入的字符队列。当队列中有足够的字符时,它们在一次操作中被一起写入。

于 2013-05-15T09:05:13.163 回答
1

有些设备速度很慢,因此一次写入一个字符效率不高。写入设备的有效方法是一次写入更大的数据块。因此缓冲区用于累积更多字符并在一次写入操作中将它们全部写入。

于 2013-05-15T09:08:59.823 回答
0

我不熟悉这本书或引用,所以这可能无法回答您的确切观点。

从本质上讲,计算机非常快。在这个地方移动电子并执行计算等等非常快。相比之下,输入/输出设备要慢得多——磁盘需要转动才能写入或读取表面的正确部分,屏幕需要一些时间才能使正确的部分以正确的颜色发光,等等。

然而,写入输出设备的大部分开销都花在了写入第一个字符(或字节,或其他)上,并且几乎没有额外的开销写入多个 - 一旦磁盘位于第一个字节的正确位置,它就是在几乎正确的位置进行下一个等等;人们不会一次真正地阅读屏幕一个字符,他们倾向于阅读单词或整个句子,因此快速在屏幕上显示第一个字母并不值得担心,您不妨等到几个。

因此,将许多字节、字符或其他任何东西一起收集并一次写入它们是有意义的。这个过程称为缓冲,收集数据的内存区域称为缓冲区。

将缓冲区中的数据写入设备称为刷新缓冲区。

于 2013-05-15T09:12:00.257 回答
0

让我们将 HDD 视为输出设备。与 RAM 相比,写入 HDD 非常慢。在 HDD 上一次写入一大块数据比写入大量小块要快得多。缓冲区用于累积这些块。例如,它可能会等到您要求写入总共 1 MB 的数据。之后,缓冲区被刷新(写入)到磁盘上。所以缓冲区只是一个存储

于 2013-05-15T09:05:12.937 回答
0

为什么大多数系统要花费大量时间将字符写入输出设备?

对于普通计算机,将任何内容写入典型的输出设备将比写入内部易失性存储器花费更长的时间。

这个缓冲区是什么,我们为什么需要它?

缓冲区是要移动到其他地方的数据的临时存储。

为什么我们需要刷新缓冲区?

这是缓冲区的功能,在上面的链接中进行了描述。

于 2013-05-15T09:09:06.120 回答