通常涉及两个级别的缓冲:内部缓冲器
操作系统缓冲区
内部缓冲区是由运行时/库/语言创建的缓冲区,您可以针对这些缓冲区进行编程,并通过避免每次写入时的系统调用来加快速度。相反,当您写入一个文件对象时,您将写入它的缓冲区,并且每当缓冲区填满时,数据将使用系统调用写入实际的文件。
但是,由于操作系统缓冲区的原因,这可能并不意味着数据被写入磁盘。这可能只是意味着数据从运行时维护的缓冲区复制到操作系统维护的缓冲区中。
如果你写了一些东西,结果它在缓冲区(仅)中,并且你的机器断电了,那么当机器关机时,数据不在磁盘上。
因此,为了帮助您在它们各自的对象上使用flush和fsync方法。
第一个flush将简单地将程序缓冲区中的任何数据写入实际文件。通常这意味着数据将从程序缓冲区复制到操作系统缓冲区。
具体来说,这意味着如果另一个进程打开同一个文件进行读取,它将能够访问刚刚刷新到文件中的数据。然而,这并不一定意味着它已经“永久”地存储在磁盘上。
为此,您需要调用os.fsync方法,该方法确保所有操作系统缓冲区都与它们要使用的存储设备同步,换句话说,该方法将数据从操作系统缓冲区复制到磁盘。
通常情况下,两种方法都不需要费心,但如果您处于一种对磁盘上实际结果的偏执狂是一件好事的情况下,则应该按照说明同时进行两次调用。
2018年补遗。
请注意,与2013年相比,现在使用缓存机制的磁盘要普遍得多,因此现在涉及的缓存和缓冲区级别甚至更多。我假设这些缓冲区也将由sync/flush调用处理,但我不知道。