理念/事实#1 我正在阅读关于如何缓冲流的帖子,因此fwrite()通常是缓冲流。另一方面,write()不会被缓冲。 Why the fwrite libc function is faster than the syscall write function?
理念/事实#2 我还在研究有关光盘缓存的文章以及Linux如何大量使用它来大幅改善光盘性能。 http://www.linuxatemyram.com/play.html
所以在存在磁盘缓冲的情况下,Linux默认不应该fwrite()和write()会呈现相同的性能吗? fwrite()正在做的是缓冲已经缓冲的光盘"!这不应该给予巨大的推动。我在这里缺少什么?
答案 0 :(得分:6)
fwrite
缓冲和磁盘缓存在两个非常不同的级别上工作。
fwrite
在程序级别工作:它缓冲许多小写并将它们集中在一起进行一次系统调用,而不是每次小写的单独系统调用。这样可以节省从用户模式切换到内核模式并返回的重复开销。
磁盘缓存在内核级别上工作,通过池化磁盘写入,允许它们被延迟。硬盘可能很慢,因此如果您必须等待磁盘驱动程序消耗所有数据,那么您的程序将被延迟。通过使用通常比驱动器快得多的缓存,您可以更快地完成写入并返回到程序。当程序继续运行时,缓存将慢慢清空到磁盘上,而程序不必等待它。