
似乎fflush()将数据从应用程序移动到内核文件系统缓冲区,没关系,每个人似乎都同意这一点.令我困惑的唯一一件事是,在同一篇文章中,他们假设一个回写缓存,说fsync()“数据被保存到稳定存储层”,并且在他们添加“存储本身可以存储数据”之后在回写缓存中,因此使用O_DIRECT打开的文件仍然需要fsync()才能将数据保存到稳定存储“
阅读here和there似乎事实是fsync()和sync()让数据进入存储设备,但如果这个数据有缓存层,它只是移动到这里,而不是立即移动到永久存储,数据甚至可能丢失如果出现电源故障.除非我们有一个启用了障碍的文件系统,然后“sync()/ fsync()和其他一些 *** 作将导致相应的CACHE FLUSH(ATA)或SYNCHRONIZE CACHE(SCSI)命令被发送到设备”[来自您的网站answer ]
问题:
>如果要更新的数据已经在内核缓冲区中,并且我的设备在回写模式下有一个易失性缓存层,那么就像文章所说的那样,fsync()[和我认为的sync()这样的 *** 作是正确的将数据同步到稳定的内存层,跳过易失性的数据?我认为这是通过直写缓存而不是回写缓存所发生的情况.从我读到的内容我了解到fsync()上的回写缓存只能将数据发送到设备,将它们放入易失性缓存中,并且只有在之后才能进入永久存储器
>我读到fsync()使用文件描述符然后使用单个文件,而sync()导致缓冲区的总部署,因此它适用于每个要更新的数据.从page开始,fsync()等待写入磁盘的结束,而sync()不等待实际写入磁盘的结束.两者之间的内存数据传输是否存在其他差异?
感谢那些愿意帮助的人
解决方法 “我没有任何解决方案,但肯定很佩服这个问题.”从我从你的好参考中读到的所有内容来看,没有标准.标准在内核中的某个地方结束.内核控制设备驱动程序,设备驱动程序(可能由磁盘制造商提供)通过API控制磁盘(设备上有小型计算机).制造商可能添加了足够功率的电容器/电池,以便在电源故障时冲洗其设备缓冲器,或者他可能没有.设备可以提供同步功能,但是否真正同步(刷新)设备缓冲区是未知的(取决于设备).因此,除非您根据您的规格选择并安装设备(并验证这些规格),否则您永远不会确定.
总结以上是内存溢出为你收集整理的fflush,fsync和sync与内存层全部内容,希望文章能够帮你解决fflush,fsync和sync与内存层所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)