我正在基于磁盘的进程上测试我的新算法。为了进行比较,必须测量每次 [大规模] 读/写操作所花费的确切时间。
似乎在我的 Linux VM 上,即使 flush() 已完成(例如BufferedWriter.flush()
在 Java 中),实际的磁盘写入操作仍在进行中/挂起。这一结论是基于以下证据得出的:
- 当我跑步的时候
sync ; sleep 60 ; sync
,第二个动作sync
一眨眼就完成了。 - 当我跑步时
sync ; ./myProg ; sync
,第二次同步需要40 秒。
为什么第二次同步要花这么多时间?我以为操作系统应该在程序将数据刷新到文件时保证一致性,但这里似乎并非如此。为什么 Linux 在易失性内存上进行如此危险的缓冲?
将同步时间作为实际写入时间的一部分是否合理?(在我的研究论文中)?
答案1
您fflush()
与 的各种口味混淆了fsync()
。
fflush()
确保文件处理堆栈内缓冲的任何内容都被传递给操作系统以便将其写出。
fsync()
确保操作系统将数据写入稳定存储器。