【发布时间】:2015-06-27 22:34:33
【问题描述】:
想法/事实 #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() 正在做的是“缓冲已经缓冲的磁盘”!这不应该带来巨大的推动作用。我在这里错过了什么?
【问题讨论】:
-
还是因为#1。您链接的问题中接受的答案不关心磁盘缓存;这是关于系统调用的。
-
不,这意味着
fwrite()所做的缓存会影响系统调用的次数。 -
关于性能的先验推理通常是错误的。并且关于一个函数比另一个函数快的声明通常隐含“用于......的使用模式”。根据操作系统和处理器类型,系统调用具有可变成本。根据媒体类型(盘片、SSD、ram 磁盘等)、访问类型(顺序、随机、块大小、小...)和缓存大小,缓存具有不同的成本和收益。衡量是最好的理解方式。
-
“系统调用成本”我们指的不是写操作成本(由于后台磁盘缓存,它本身可能相当低),而是用户空间和内核之间非常昂贵的 cpu 上下文切换操作的成本。 fwrite 只是保证每个 BUFSIZ 字节只有一个系统调用,从而减少了净开销。 (除非您有意通过 setvbuf 减小缓冲区大小)。
-
他们指的是切换到内核模式的开销成本。在 fwrite() 通常是库调用而 write() 是系统服务(并非在所有系统上都如此)的 Unix 系统中,后者需要从用户模式切换到内核模式。其中有很大的开销。首先,有交换机本身的开销。其次,系统服务必须验证其所有参数的安全性,并防止内核模式下的内存异常导致系统崩溃。
标签: c++ c linux io operating-system