在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据。但是我们都知道,
linux系统
的IO路径还是很复杂的,分为很多层,每一层都可能会有缓冲来加速IO读写。同时,用户态的应用程序和库函数也可能拥有自己的缓冲区,这又给IO路径增加了一些复杂性。可见,要想保证数据安全的写到磁盘上,并不是简单调一个写/写入文件就可以搞定的。
那么要怎么做呢?很多人会想到很多办法,比如:。fflush (), fsync (), fdatasync(),(),同步开放()使用O_DIRECT或O_SYNC标志等。嗯,这些手段(或者某些组合)的确可以保证数据安全的持久化,那么它们之间有什么区别呢?。fflush()和fsync()有啥区别? O_DIRECT是啥意思,它可以保证数据安全的持久化吗? O_DIRECT和O_SYNC区别什么? O_SYNC和fsync()呢? fsync能完成msync的功能吗?本文将试图理解,解释这些概念的作用和区别。
所谓一图胜千言,为了解析清楚这些概念的区别,我特意画了一张图,仔细看,应该可以清晰的看出它们的作用和区别。
Linux系统:保证数据安全落盘