在看LevelDB源码的时候,看到PosixWritableFile类的Sync函数用到了fsync和fdatasync两个Linux系统调用来将文件的修改同步到磁盘上,所以粗浅的学习了一下这两个系统调用,在此做一下记录。

Linux中写文件有write系统调用,但是write系统调用写文件时,数据并不会立即同步到磁盘上,而是会被操作系统缓存在内存的缓冲区中,随后再由操作系统写入磁盘中,而write系统调用并不会在数据同步到磁盘后才返回。这就会产生问题:在write系统调用已经返回,而数据还没有同步到磁盘上的时候,如果系统宕掉了,就会出现数据丢失的情况。

因此Linux提供了fsync系统调用,fsync系统调用会将某个文件的所有修改的数据立即同步到磁盘上,包括文件的metadata,并在所有修改数据都同步到磁盘之后才会返回。

因为要写metadata,所以fsync就涉及两次磁盘的写入,开销比较大,Linux中又提供了fdatasync系统调用。fdatasync系统调用不会同步不必要的metadata到磁盘上,比如st_atime和st_mtime就不会被同步,只会同步对后续数据读取有影响的metadata,比如st_size,因此理论上fdatasync系统调用只涉及一次磁盘写入,会比fsync系统调用快。而在某些版本的Linux中,fdatasync系统调用和fsync系统调用实际上是一样的,都会同步st_atime和st_mtime。

另外,在使用open系统调用的时候传入O_SYNC标记能使所有的文件写入都被立即同步到磁盘上。

391 Love u

fsync和fdatasync的更多相关文章

  1. linux 同步IO: sync msync、fsync、fdatasync与 fflush

    最近阅读leveldb源码,作为一个保证可靠性的kv数据库其数据与磁盘的交互可谓是极其关键,其中涉及到了不少内存和磁盘同步的操作和策略.为了加深理解,从网上整理了linux池畔同步IO相关的函数,这里 ...

  2. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  3. Linux系统调用---同步IO: sync、fsync与fdatasync【转】

    转自:http://blog.csdn.net/cywosp/article/details/8767327 [-] 1  write不够需要fsync 2 fsync的性能问题与fdatasync ...

  4. 同步内核缓冲区sync、fsync和fdatasync函数

    转自http://www.2cto.com/os/201409/339460.html 同步内核缓冲区 1.缓冲区简介 人生三大错觉之一:在调用函数write()时,我们认为该函数一旦返回,数据便已经 ...

  5. 文件I/O之sync、fsync和fdatasync函数

    传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将数据复制到其中一个缓冲区中,如果 该缓冲区尚未写满,则并不将其排入输出队列, ...

  6. 《UNIX环境高级编程》笔记--sync、fsync和fdatasync函数

    传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘 I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列 ...

  7. 同步内核缓冲区 sync、fsync和fdatasync函数

    同步内核缓冲区 1.缓冲区简单介绍 人生三大错觉之中的一个:在调用函数write()时,我们觉得该函数一旦返回,数据便已经写到了文件里.可是这样的概念仅仅是宏观上的.实际上.操作系统实现某些文件I/O ...

  8. linuxIO刷新机制fsync和fdatasync详细解释

    前言: Linux,unix在内核中设有 缓冲区快速缓冲或页面快速缓冲.大多数磁盘I/O都通过缓冲进行,採用延迟写技术. sync:将全部改动过的快缓存区排入写队列.然后返回.并不等待实际写磁盘操作结 ...

  9. 【珍藏】linux 同步IO: sync、fsync与fdatasync

    传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列, ...

随机推荐

  1. influxdb 全家桶运行

    一个简单的demo,集成了telegraf,influxdb,chronograf,kapacitor,nginx,一张来自官方的参考图 组件集成图 环境准备 使用docker-compose doc ...

  2. jmeter的简单http接口用法

    1.  jmeter的启动:windows下的环境 进入jmeter的并目录双击启动 Mac电脑 进入bin目录找到jmeter.sh 文件 在终端执行./jmeter.sh 或者./jmeter. ...

  3. Kivy中文编程指南--https://cycleuser.gitbooks.io/kivy-guide-chinese/content/

    Kivy 是一个开源的 Python 框架,用于快速开发应用,实现各种当前流行的用户界面,比如多点触摸等等. + Kivy 可以运行于 Windows, Linux, MacOS, Android, ...

  4. 【java】之位运算^,&,<<,>>,<<<,>>>总结

    1.^(亦或运算) ,针对二进制,相同的为0,不同的为1 public static void main(String[] args) { System.out.println("2^3运算 ...

  5. idea基本使用1

    首先推荐两个快捷键 alt+Ent        相当于eclipse中的crtl+1 alt+ins         :能创建包,类等,还能生成getter,setter,和构造函数 首先创建一个w ...

  6. (转)SQLServer_十步优化SQL Server中的数据访问 二

    原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml 第五步:识别低效TSQL,采用最佳实践重构和应用TSQL 由于每个程序 ...

  7. 请推荐一本SQL教程

    sql系列教程如下 sql教程 SQL 是用于访问和处理数据库的标准的计算机语言. 在本教程中,您将学到如何使用 SQL 访问和处理数据系统中的数据, 这类数据库包括:mysql.SQL Server ...

  8. flutter 底部按钮切换页面

    界面如图: 我们就从上节里面的app.dartt修改 目录:lib lib/story 其它两个目录一样. 图片配置一下 app.dart import 'package:flutter/materi ...

  9. Java学习笔记——鸵鸟学习记(一)

    1. 变量 1.1 使用变量 a, 变量三要素:名字 值 类型 b, 变量命名 英文字母,数字,下划线,但不能数字开头 并不是英文单词,用拼音也可以 随便写也可以,但可读性差 区分大小写(Y与y是不同 ...

  10. strace参数

    strace参数 -c 统计每一系统调用的所执行的时间,次数和出错的次数等. -d 输出strace关于标准错误的调试信息. -f 跟踪由fork调用所产生的子进程. -ff 如果提供-o filen ...