fwrite() 与 write() 在存在磁盘缓存的情况下

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

本文关键字:缓存 情况下 磁盘 write fwrite 存在      更新时间:2023-10-16

Idea/Fact #1我正在阅读一些关于如何缓冲流的文章,因此 fwrite() 通常是缓冲流。另一方面,write() 不会被缓冲。为什么 fwrite libc 函数比 syscall write 函数快?

想法/事实 #2我还在研究有关光盘缓存的文章,以及 Linux 如何大量使用它来大幅提高光盘性能。http://www.linuxatemyram.com/play.html

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

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

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

磁盘

缓存在内核级别工作,通过池化磁盘写入,允许它们延迟。硬盘可能很慢,因此,如果您必须等待磁盘驱动程序使用所有数据,那么您的程序将被延迟。通过利用缓存(通常比驱动器快得多),您可以更快地完成写入并返回到程序。当程序继续运行时,缓存将慢慢清空到磁盘上,而无需程序等待它。