什么是非缓冲I/O和标准I/O的区别?我知道使用read()、write()、close()是非缓冲I/O,而printf和gets是缓冲I/O。我也知道在进行大量数据读写时最好使用缓冲I/O,但我不知道原因是什么。在这个语境中,“缓冲”一词是什么意思?
无缓冲I/O意味着在读写时不使用任何缓冲区。通常,当我们使用系统调用如read()和write()时,它们逐个字符地读写,并且可能导致巨大的性能降低。因此,对于大数据量,通常优先选择高级读/写或简单的缓冲I/O。缓冲简单地意味着我们不处理单个字符,而是一块字符,这就是为什么有时也被称为块I/O。通常在Unix中,当我们使用高级读/写函数时,它们会获取/存储给定块大小的数据并将其放置在缓冲缓存中,从该缓冲缓存中这些I/O函数获取所需量的数据。
O_DIRECT
,否则都是内核缓冲的。对于您的上下文,缓冲意味着C库维护一个内部数组,不会在每个I/O函数调用后刷新。相反,必须调用fflush。同样,读取缓冲区可能会导致读取期间每次调用花费较少的时间。 - moshbear