问题
如何在不需要程序等待缓慢物理介质(例如使用fsync
)的情况下原子更新文件?
我希望操作系统可以在RAM中“缓冲”典型的fsync
和rename
操作,然后在方便的时候以正确的顺序将它们写入磁盘。
背景
我正在开发运行在定制嵌入式Linux环境中的软件,使用ext4
文件系统。该程序会定期更新磁盘上的一个文件。我需要维护这个文件的完整性,同时又不损失应用程序的性能。
根据我所了解到的文章,安全地更新文件的惯例如下:
- 创建一个新的临时文件
- 向临时文件写入数据
fsync()
临时文件- 将临时文件重命名为适当的名称
fsync()
包含目录
这个过程对我来说是有意义的,但在我的特定应用程序中,我想避免对fsync()
的阻塞调用。只要文件始终处于有效状态,我不关心数据何时写入磁盘。如果文件已过时,那没问题。
到目前为止我学到了什么
似乎已经有很多关于ext4
和正确使用fsync
的讨论。如果我理解正确,如果我的文件系统启用了auto_da_alloc
,我可能可以放弃使用fsync
(链接),但我并不认为这是最佳解决方案。
aio_fsync
。而glibc的aio_fsync
实现只是为您完成相同的工作 -aio_fsync
创建另一个线程,在该线程中调用fsync
并为您引发信号。 - KamilCukfsync
的目的是防止程序在时间未到(所有新数据已写入磁盘)之前执行rename
等不安全操作。等待不仅仅是一个麻烦,它是算法的关键部分。如果您不打算等待步骤3中的fsync完成,那么首先调用它就没有太多意义。 - user4815162342