【问题标题】:fsync vs write system callfsync vs write 系统调用
【发布时间】:2012-04-29 09:17:21
【问题描述】:

我想问一个基本问题,即何时使用 fsync 之类的系统调用有用。我是初学者,我一直认为 write 足以写入文件,而使用 write 的示例实际上在最后写入文件。

那么像 fsync 这样的系统调用的目的是什么?

只是为了提供一些背景信息,我正在使用 Berkeley DB 库 5.1.19 版,并且有很多关于 fsync() 与编写成本的讨论。这就是我想知道的原因。

【问题讨论】:

    标签: filesystems berkeley-db


    【解决方案1】:

    把它想象成一层缓冲。

    如果您熟悉 fopenfprintf 等标准 C 调用,您应该已经知道 C 运行时库本身中发生的缓冲。

    刷新这些缓冲区的方法是使用fflush,它确保信息从 C 运行时库传递到操作系统(或周围环境)。

    但是,仅仅因为操作系统有它,并不意味着它在磁盘上。它也可以在操作系统中缓冲。

    这就是fsync 负责的工作,确保将操作系统缓冲区中的内容物理写入磁盘。

    您通常会在日志库中看到此类操作:

    fprintf (myFileHandle, "something\n");  // output it
    fflush (myFileHandle);                  // flush to OS
    fsync (fileno (myFileHandle));          // flush to disk
    

    fileno 是一个函数,它为给定的FILE* 文件句柄提供底层int 文件描述符,而描述符上的fsync 执行最后一级的刷新。

    现在 是一个相对昂贵的操作,因为磁盘写入通常比内存中传输慢得多。

    除了日志库之外,另一个用例可能对这种行为有用。让我看看我是否记得那是什么。对,就是那样。数据库!就像 Berzerkely DB 一样。如果您想确保数据在磁盘上,这是一个非常有用的功能,可以满足 ACID 要求:-)

    【讨论】:

    • 谢谢,这很有帮助。如果我不明确调用 fsync,操作系统(在我的情况下是 Linux)什么时候决定将数据刷新到磁盘?
    • @isaac.hazan,我完全不知道。可能的情况是缓冲区填满时,文件描述符关闭时,经过一定时间时,或者感觉像这样时:-) 它可能会根据您正在使用的任何文件系统的设备驱动程序而改变。基本上,你不应该担心什么时候,除非你需要现在,在这种情况下你会fsync。否则,由操作系统决定。
    • @paxidablo: 1) “当文件描述符关闭时”:这是最广泛传播的误解之一。 close 并不意味着写入缓冲页面。 2) fsync 的替代方法是打开带有 O_SYNC 标志的文件。 3) 在糟糕的消费者磁盘/SSD 中,即使是 fsync 也可能不足以强制数据持久化。在这种情况下,用户/开发人员基本上无能为力。
    • @dmeister,这些都是可能性,而不是明确的陈述。我将不得不查看内核源代码来确认,而且考虑到默认行为通常足够(除非严重的系统崩溃)并且如果您决定 fsync is 需要并且它失败了,这比它值得付出更多的努力,你无能为力:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2014-02-22
    相关资源
    最近更新 更多