UNIX缓冲与非缓冲I/O

UNIX缓冲与非缓冲I/O,unix,io,buffered,Unix,Io,Buffered,无缓冲I/O和标准I/O之间有什么区别?我知道使用read()、write()和close()是无缓冲IO。Printf和get是缓冲IO。我还知道,对于大型事务,最好使用缓冲IO。我只是不知道为什么。术语“buffered”在此上下文中是什么意思?无缓冲I/O只是指在读取或写入时不使用任何缓冲区。通常,当我们使用诸如read()和write()之类的系统调用时,它们逐字符读取和写入,会导致性能严重下降。因此,对于大型数据,通常首选高级读/写或简单的缓冲I/O。缓冲简单地说,我们处理的不是单个字

无缓冲I/O和标准I/O之间有什么区别?我知道使用read()、write()和close()是无缓冲IO。Printf和get是缓冲IO。我还知道,对于大型事务,最好使用缓冲IO。我只是不知道为什么。术语“buffered”在此上下文中是什么意思?

无缓冲I/O只是指在读取或写入时不使用任何缓冲区。通常,当我们使用诸如read()和write()之类的系统调用时,它们逐字符读取和写入,会导致性能严重下降。因此,对于大型数据,通常首选高级读/写或简单的缓冲I/O。缓冲简单地说,我们处理的不是单个字符,而是一个字符块,这就是为什么有时它也被称为块I/O。通常在Unix中,当我们使用高级读/写函数时,它们获取/存储给定块大小的数据,并将其放在缓冲区缓存中,这些I/O函数从该缓冲区缓存中获得所需的数据量。

您的问题与此类似:严格来说,在Linux上,除非启用了
O_DIRECT
,否则读取等都是内核缓冲的。在您的上下文中,缓冲意味着C库维护一个内部数组,该数组在每次I/O函数调用后都不会刷新。相反,必须调用fflush。同样,读取缓冲区在读取过程中可能会减少每次调用的挂起。@moshbear:您能澄清一下fflush的作用吗?它是刷新c内部数组还是缓存?手册中:对于输出流,fflush()通过流的底层写函数强制写入给定输出或更新流的所有用户空间缓冲数据。对于输入流,fflush()将丢弃已从基础文件中提取但尚未被应用程序使用的任何缓冲数据。