我知道已经有类似的问题,我给了他们一个看,但我找不到一个明确的单一答案我的问题.我只是在网上调查这些函数及其与内存层的关系.特别是我发现这个美丽的
article让我对记忆层有了很好的了解
似乎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()不等待实际写入磁盘的结束.两者之间的内存数据传输是否存在其他差异?
感谢那些愿意帮助的人