我知道已经有类似的问题,我看了看,但我找不到一个明确的、明确的答案来回答我的问题。我只是在网上调查这些功能及其与内存层的关系。特别是我发现了这篇漂亮的文章,它让我对内存层有了很好的了解
似乎fflush()
将数据从应用程序移动到内核文件系统缓冲区,没关系,每个人似乎都同意这一点。唯一让我感到困惑的是,在同一篇文章中,他们假设写回缓存说fsync()
“数据保存到稳定存储层”,然后他们补充说“存储本身可以将数据存储在写入-back 缓存,因此fsync()
使用 O_DIRECT 打开的文件仍然需要将数据保存到稳定的存储中”
在这里和那里阅读似乎事实是,fsync()
让sync()
数据进入存储设备,但如果这个有缓存层,它只是被移动到这里,而不是立即移动到永久存储,如果出现电源故障,数据甚至可能丢失. 除非我们有一个启用了障碍的文件系统,然后“ sync()
/fsync()
和其他一些操作将导致适当的 CACHE FLUSH (ATA) 或 SYNCHRONIZE CACHE (SCSI) 命令发送到设备” [来自您的网站答案]
问题:
如果要更新的数据已经在内核缓冲区中,并且我的设备在回写模式下有一个易失性缓存层,那么就像文章所说的那样,像
fsync()
[sync()
我想] 这样的操作将数据同步到稳定的内存层是真的吗跳过易失性的?我认为这是直写式缓存发生的情况,而不是回写式缓存。根据我的阅读,我了解到,使用回写缓存fsync()
可以将数据发送到将它们放入易失性缓存中的设备,并且它们只有在之后才会进入永久内存我读到它
fsync()
使用文件描述符,然后使用单个文件,同时sync()
导致缓冲区的总部署,因此它适用于要更新的每个数据。并且从这个页面也fsync()
等待写入磁盘sync()
的结束,而不等待实际写入磁盘的结束。两者之间是否存在与内存数据传输相关的其他差异?
感谢那些愿意提供帮助的人