UNIX缓冲与非缓冲I/O

4
什么是非缓冲I/O和标准I/O的区别?我知道使用read()、write()、close()是非缓冲I/O,而printf和gets是缓冲I/O。我也知道在进行大量数据读写时最好使用缓冲I/O,但我不知道原因是什么。在这个语境中,“缓冲”一词是什么意思?

5
你的问题看起来类似于这个链接中的问题:https://dev59.com/7XM_5IYBdhLWcg3wRw11 - Dave
3
严格来说,在Linux中,读取等操作除非启用O_DIRECT,否则都是内核缓冲的。对于您的上下文,缓冲意味着C库维护一个内部数组,不会在每个I/O函数调用后刷新。相反,必须调用fflush。同样,读取缓冲区可能会导致读取期间每次调用花费较少的时间。 - moshbear
@moshbear:您能否澄清fflush的作用是什么?它是刷新C内部数组还是缓冲高速缓存? - FourOfAKind
从手册中:对于输出流,fflush()通过流的底层写函数强制写入给定输出或更新流的所有用户空间缓冲数据。对于输入流,fflush()会丢弃已从底层文件获取但尚未被应用程序使用的任何缓冲数据。 - moshbear
1个回答

7

无缓冲I/O意味着在读写时不使用任何缓冲区。通常,当我们使用系统调用如read()和write()时,它们逐个字符地读写,并且可能导致巨大的性能降低。因此,对于大数据量,通常优先选择高级读/写或简单的缓冲I/O。缓冲简单地意味着我们不处理单个字符,而是一块字符,这就是为什么有时也被称为块I/O。通常在Unix中,当我们使用高级读/写函数时,它们会获取/存储给定块大小的数据并将其放置在缓冲缓存中,从该缓冲缓存中这些I/O函数获取所需量的数据。


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