首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缓冲IO与非缓冲IO

缓冲IO与非缓冲IO
EN

Stack Overflow用户
提问于 2009-09-20 07:56:08
回答 2查看 59.2K关注 0票数 91

我了解到,默认情况下,程序中的I/O是缓冲的,也就是说,它们是从临时存储器提供给请求程序的。我知道缓冲可以提高IO性能(可能是通过减少系统调用)。我见过禁用缓冲的例子,比如C中的setvbuf。这两种模式之间的区别是什么,什么时候应该使用一种模式而不是另一种模式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-20 08:02:10

当您想要确保输出在继续之前已被写入时,您希望无缓冲输出。一个例子是C运行时库下的标准错误--默认情况下这通常是无缓冲的。由于错误(希望)很少发生,所以您希望立即了解它们。另一方面,标准输出是缓冲的,因为它假设会有更多的数据通过它。

另一个例子是日志库。如果您的日志消息保存在进程的缓冲区中,并且您的进程转储内核,则很有可能永远不会写入输出。

此外,不仅系统调用被最小化,磁盘I/O也被最小化。假设一个程序一次读取一个字节的文件。使用无缓冲的输入,您将为每个字节访问磁盘(相对非常慢),即使它可能无论如何都必须读取整个块(磁盘硬件本身可能有缓冲区,但您仍将访问磁盘控制器,这将比内存访问慢)。

通过缓冲,整个块被一次读入缓冲区,然后单个字节从(内存中,令人难以置信的快)缓冲区传递给你。

请记住,缓冲可以采用多种形式,例如在以下示例中:

代码语言:javascript
复制
+-------------------+-------------------+
| Process A         | Process B         |
+-------------------+-------------------+
| C runtime library | C runtime library | C RTL buffers
+-------------------+-------------------+
|               OS caches               | Operating system buffers
+---------------------------------------+
|      Disk controller hardware cache   | Disk hardware buffers
+---------------------------------------+
|                   Disk                |
+---------------------------------------+
票数 141
EN

Stack Overflow用户

发布于 2011-02-19 08:39:08

当您已经有大量字节序列准备写入磁盘时,您希望无缓冲输出,并且希望避免将额外的复制复制到中间的第二个缓冲区中。

缓冲的输出流会将写入结果累积到中间缓冲区中,仅当累积足够的数据(或请求flush() )时才将其发送到操作系统文件系统。这减少了文件系统调用的数量。由于文件系统调用在大多数平台上的开销可能很大(与短memcpy相比),因此在执行大量小型写操作时,缓冲输出是最大的优势。当您已经有很大的缓冲区要发送时,无缓冲输出通常更好--复制到中间缓冲区不会进一步减少OS调用的数量,并会引入额外的工作。

无缓冲输出与确保数据到达磁盘没有任何关系;该功能由flush()提供,可用于缓冲和非缓冲数据流。无缓冲IO写入并不能保证数据已到达物理磁盘--操作系统文件系统可以无限期地保留数据的副本,如果需要的话,永远不会将其写入磁盘。只有在调用flush()时才需要将其提交到磁盘。(请注意,close()将代表您调用flush() )。

票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1450551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档