fflush,fsync和sync与内存层

我知道已经有类似的问题,我给了他们一个看,但我找不到一个明确的单一答案我的问题.我只是在网上调查这些函数及其与内存层的关系.特别是我发现这个美丽的article让我对记忆层有了很好的了解

似乎fflush()将数据从应用程序移动到内核文件系统缓冲区,没关系,每个人似乎都同意这一点.令我困惑的唯一一件事是,在同一篇文章中,他们假设一个回写缓存,说fsync()“数据被保存到稳定存储层”,并且在他们添加“存储本身可以存储数据”之后在回写缓存中,因此使用O_DIRECT打开的文件仍然需要fsync()才能将数据保存到稳定存储“

阅读herethere似乎事实是fsync()和sync()让数据进入存储设备,但如果这个数据有缓存层,它只是移动到这里,而不是立即移动到永久存储,数据甚至可能丢失如果出现电源故障.除非我们有一个启用了障碍的文件系统,然后“sync()/ fsync()和其他一些操作将导致相应的CACHE FLUSH(ATA)或SYNCHRONIZE CACHE(SCSI)命令被发送到设备”[来自您的网站answer ]

问题:

>如果要更新的数据已经在内核缓冲区中,并且我的设备在回写模式下有一个易失性缓存层,那么就像文章所说的那样,fsync()[和我认为的sync()这样的操作是正确的将数据同步到稳定的内存层,跳过易失性的数据?我认为这是通过直写缓存而不是回写缓存所发生的情况.从我读到的内容我了解到fsync()上的回写缓存只能将数据发送到设备,将它们放入易失性缓存中,并且只有在之后才能进入永久存储器
>我读到fsync()使用文件描述符然后使用单个文件,而sync()导致缓冲区的总部署,因此它适用于每个要更新的数据.从page开始,fsync()等待写入磁盘的结束,而sync()不等待实际写入磁盘的结束.两者之间的内存数据传输是否存在其他差异?

感谢那些愿意帮助的人

最佳答案
“我没有任何解决方案,但肯定很佩服这个问题.”

从我从你的好参考中读到的所有内容来看,没有标准.标准在内核中的某个地方结束.内核控制设备驱动程序,设备驱动程序(可能由磁盘制造商提供)通过API控制磁盘(设备上有小型计算机).制造商可能添加了足够功率的电容器/电池,以便在电源故障时冲洗其设备缓冲器,或者他可能没有.设备可以提供同步功能,但是否真正同步(刷新)设备缓冲区是未知的(取决于设备).因此,除非您根据您的规格选择并安装设备(并验证这些规格),否则您永远不会确定.

转载注明原文:fflush,fsync和sync与内存层 - 代码日志