【问题标题】:fwrite() vs write() in presence of disc caching存在磁盘缓存时的 fwrite() 与 write()
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-06-12
    • 2017-11-19
    • 2014-12-12
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多