【发布时间】:2015-07-23 01:41:30
【问题描述】:
我知道已经有类似的问题,我看了看,但我找不到明确的、明确的答案。我只是在网上调查这些功能及其与内存层的关系。特别是我发现了这个漂亮的article,它让我对内存层有了很好的了解
似乎fflush() 将数据从应用程序移动到内核文件系统缓冲区,没关系,每个人似乎都同意这一点。唯一让我感到困惑的是,在同一篇文章中,他们假设写回缓存说fsync()“数据保存到稳定存储层”,然后他们补充说“存储本身可能存储数据在回写缓存中,因此使用 O_DIRECT 打开的文件仍需要fsync(),以便将数据保存到稳定的存储中"
阅读here 和there 似乎事实是fsync() 和sync() 让数据进入存储设备,但如果这个有缓存层,它只是移动到这里,而不是立即永久保存如果发生电源故障,存储和数据甚至可能丢失。除非我们有一个启用了障碍的文件系统,然后“sync()/fsync() 和其他一些操作将导致适当的 CACHE FLUSH (ATA) 或 SYNCHRONIZE CACHE (SCSI) 命令发送到设备” [来自您的网站 @ 987654324@]
问题:
-
1234563 987654336@我想]将数据同步到稳定的内存层跳过易失性?我认为这是直写式缓存发生的情况,而不是回写式缓存。根据我的阅读,我了解到
我读到
fsync()使用文件描述符,然后使用单个文件,而sync()导致缓冲区的总部署,因此它适用于要更新的每个数据。从这个page 也可以看出fsync()等待写入磁盘的结束,而sync()不等待实际写入磁盘的结束。两者之间是否存在与内存数据传输相关的其他差异?
fsync() 上的回写缓存可以将数据发送到将它们放入易失性缓存中的设备,并且它们只会在之后进入永久内存
感谢那些愿意提供帮助的人
【问题讨论】:
-
这个 PostgreSQL vs. fsync() 视频包含很多关于 fsync() 的信息。它可能有助于完成部分难题:fosdem.org/2019/schedule/event/postgresql_fsync
标签: c linux caching synchronization fsync