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