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