【问题标题】:Use of Buffer in C++C++中缓冲区的使用
【发布时间】:2013-05-15 09:02:10
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ io buffer


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    因为大多数设备通过总线与 CPU 分开,通过总线发送数据比写入 CPU 寄存器或(缓存)内存要慢得多。而且许多设备都涉及到运动部件(旋转盘或电动激光器或其他任何东西),这些部件又要慢得多。

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

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

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

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

            这是一个缓冲区的功能,在上面的链接中描述。

            【讨论】:

              【解决方案7】:

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

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

              但是,写入输出设备的大量开销都用于写入第一个字符(或字节或其他字符),而写入更多字符的额外开销非常少 - 一旦磁盘位于第一个字符的正确位置字节,它几乎在正确的位置,以此类推;人们不会一次真正地阅读屏幕一个字符,他们倾向于阅读单词或整个句子,因此快速在屏幕上显示第一个字母并不值得担心,您不妨等到几个。

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

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

              【讨论】:

                猜你喜欢
                • 2014-07-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-11-14
                • 1970-01-01
                • 2011-09-07
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多