网站建设规划设计,手机企业网站管理系统,视频在线观看网站怎么建设,网站用自己的电脑做服务器背景在很多IO场景中#xff0c;我们经常需要确保数据已经安全的写到磁盘上#xff0c;以便在系统宕机重启之后还能读到这些数据。但是我们都知道#xff0c;linux系统的IO路径还是很复杂的#xff0c;分为很多层#xff0c;每一层都可能会有buffer来加速IO读写。同时…背景在很多IO场景中我们经常需要确保数据已经安全的写到磁盘上以便在系统宕机重启之后还能读到这些数据。但是我们都知道linux系统的IO路径还是很复杂的分为很多层每一层都可能会有buffer来加速IO读写。同时用户态的应用程序和库函数也可能拥有自己的buffer这又给IO路径增加了一些复杂性。可见要想保证数据安全的写到磁盘上并不是简单调一个write/fwrite就可以搞定的。那么要怎么做呢很多人会想到很多办法比如fflush()、fsync()、fdatasync()、sync()、open()使用O_DIRECT或O_SYNC标志等。嗯这些手段(或者某些组合)的确可以保证数据安全的持久化那么它们之间有什么区别呢fflush()和fsync()有啥区别O_DIRECT是啥意思它可以保证数据安全的持久化吗O_DIRECT和O_SYNC区别什么O_SYNC和fsync()呢fsync能完成msync的功能吗本文将试图理解、解释这些概念的作用和区别。所谓一图胜千言为了解析清楚这些概念的区别我特意画了一张图仔细看应该可以清晰的看出它们的作用和区别。这里重点说一下O_DIRECT和O_SYNC首先要明确的是O_DIRECT只是说数据不会经过page cache(一般用在用户态自己管理buffer)而是直接提交给块设备层但是不会同步等待数据安全写入磁盘之后才返回(比如数据可能还在块层排队或者在磁盘自己的cache中)。而O_SYNC标志虽然数据还是会写page cache但是此时会采用write through的策略并同步等待数据安全写入磁盘后才会返回。因此如果同时使用O_DIRECT和O_SYNC则表示数据不会经过page cache并同步等待数据安全写入磁盘才返回当然这样IO的性能会非常低下。由于O_DIRECT会bypass page cache因此如果有另一个进程使用普通的方式读文件有可能会出现数据不一致的现象这个也需要注意。为了做一下辅助说明此处我贴一下我探讨过程中看过的一些资料。首先是引用open系统调用http://man7.org/linux/man-pages/man2/open.2.html相关参数的说明以及innodb相关的文档https://lwn.net/Articles/457667/fsync和fdatasync的区别http://man7.org/linux/man-pages/man2/fsync.2.htmlmsync:http://man7.org/linux/man-pages/man2/msync.2.htmlDAX其实还有一种IO模式就是DAX(Direct Access )是不是看上去和O_DIRECT很像。这种模式需要filesystem和block driver都支持才可以一般主要用在non volatile memory上本质上也是绕过page cache直接操作设备。DAX本文先不做深入探讨后面我会自己写一个支持DAX模式的ramdisk块设备驱动然后格式化为ext4文件系统并-o dax模式挂载再来详细研究DAX的IO路径。最后附上Linux在常见场景下的io路径跟踪https://my.oschina.net/fileoptions/blog/3061822