fwrite() 与 write() 存在磁盘缓存

fwrite() vs write() in presence of disc caching

Idea/Fact#1 我很少阅读 post 关于如何缓冲流的信息,因此 fwrite() 通常是缓冲流。另一方面 write() 不会被缓冲。 Why the fwrite libc function is faster than the syscall write function?

Idea/Fact#2 我还查看了有关磁盘缓存的文章以及 Linux 如何大量使用它来显着提高磁盘性能。 http://www.linuxatemyram.com/play.html

因此,在 Linux 默认执行的磁盘缓冲存在的情况下,fwrite() 和 write() 不应该呈现相同的性能吗? fwrite() 正在做的是 "buffering over already buffered disc"!这不应该给巨大的推动。我在这里错过了什么?

fwrite 缓冲和磁盘缓存在两个截然不同的级别上工作。

fwrite 在程序级别上工作:它缓冲大量小写并将它们集中在一起以进行一个系统调用,而不是为每个小写进行单独的系统调用。这为您节省了从用户模式切换到内核模式并返回的重复开销。

磁盘缓存在内核级别工作,通过汇集磁盘写入,允许它们被延迟。硬盘可能很慢,所以如果您必须等待磁盘驱动程序消耗完所有数据,那么您的程序就会延迟。通过使用通常比驱动器快得多的缓存,您可以更快地完成对程序的写入和return。当程序继续运行时 运行,缓存将慢慢清空到磁盘上,程序无需等待。