fsync和fdatasync
在看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的更多相关文章
- linux 同步IO: sync msync、fsync、fdatasync与 fflush
		最近阅读leveldb源码,作为一个保证可靠性的kv数据库其数据与磁盘的交互可谓是极其关键,其中涉及到了不少内存和磁盘同步的操作和策略.为了加深理解,从网上整理了linux池畔同步IO相关的函数,这里 ... 
- 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 ... 
- Linux系统调用---同步IO: sync、fsync与fdatasync【转】
		转自:http://blog.csdn.net/cywosp/article/details/8767327 [-] 1 write不够需要fsync 2 fsync的性能问题与fdatasync ... 
- 同步内核缓冲区sync、fsync和fdatasync函数
		转自http://www.2cto.com/os/201409/339460.html 同步内核缓冲区 1.缓冲区简介 人生三大错觉之一:在调用函数write()时,我们认为该函数一旦返回,数据便已经 ... 
- 文件I/O之sync、fsync和fdatasync函数
		传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将数据复制到其中一个缓冲区中,如果 该缓冲区尚未写满,则并不将其排入输出队列, ... 
- 《UNIX环境高级编程》笔记--sync、fsync和fdatasync函数
		传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘 I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列 ... 
- 同步内核缓冲区 sync、fsync和fdatasync函数
		同步内核缓冲区 1.缓冲区简单介绍 人生三大错觉之中的一个:在调用函数write()时,我们觉得该函数一旦返回,数据便已经写到了文件里.可是这样的概念仅仅是宏观上的.实际上.操作系统实现某些文件I/O ... 
- linuxIO刷新机制fsync和fdatasync详细解释
		前言: Linux,unix在内核中设有 缓冲区快速缓冲或页面快速缓冲.大多数磁盘I/O都通过缓冲进行,採用延迟写技术. sync:将全部改动过的快缓存区排入写队列.然后返回.并不等待实际写磁盘操作结 ... 
- 【珍藏】linux 同步IO: sync、fsync与fdatasync
		传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列, ... 
随机推荐
- 计算机图形学----基于3D图形开发技术 (韩正贤 著)
			第1章 游戏模型 第2章 顶点处理机制 第3章 光栅化操作 第4章 片元处理和输出合并 第5章 光照和着色 第6章 参数曲线和表面 第7章 着色器模型 第8章 图像纹理 第9章 凹凸贴图 第10章 高 ... 
- Cygwin,一个提供linux命令行体验的Windows命令行工具
			安装 从官网下载,选择合适节点(带edu结尾的优先),安装 使用 未完待续... 
- Java高级特性 第9节 Socket机制
			一.Socket简介 1.Socket概述 Java最初是作为网络编程语言出现的,它对网络的高度支持,使得客户端和服务器流畅的沟通变成现实.而在网络编程中,使用最多的就是Socket,每一个实用的网络 ... 
- <ROS> NodeHandle句柄
			作者:jack_20 原文:https://blog.csdn.net/jack_20/article/details/70746736 1.句柄可以让你通过构造函数指定命名空间 ros::NodeH ... 
- UIScrollView的AutoLayout约束
			首先UIScrollview包含自身的frame和contentSize二个部分.frame决定其展示给用户的可见区域,contentSize决定其整个内容的大小.如果frame的宽高小于conten ... 
- 未来-区块链-Aliyun:阿里云IoT - 所知不止于感知
			ylbtech-未来-区块链-Aliyun:阿里云IoT - 所知不止于感知 1.返回顶部 1. 基础产品接入 设备接入 设备管理 数据分析 应用开发 网络管理 边缘计算 设备认证 安全运营 AliO ... 
- spring boot websocket  stomp 实现广播通信和一对一通信聊天
			一.前言 玩.net的时候,在asp.net下有一个叫 SignalR 的框架,可以在ASP .NET的Web项目中实现实时通信.刚接触java寻找相关替代品,发现 java 体系中有一套基于stom ... 
- python,列表,元祖,字典
			list 列表 li = [1,",[3,4]] 1.用中括号括起来 2.用,来分割每一个元素 3.列表中的元素可以是,数字,字符串,列表,布尔值 4.“集合”,内部可以放置任何东西 li ... 
- Window 无法完成请求的更改,找不到引用的汇编,错误代码 0X80073701
			window 10专业版,通过“启用和关闭Window功能”进行安装IIS的部分功能的时候报错: Window 无法完成请求的更改,找不到引用的汇编,错误代码 0X80073701 备注以及尝试: ( ... 
- MVC动态赋值的td选中,获取当前的td的ID或者值
			前台绑定数据: <div class="mailbox-content"> <table class="table"> <tbod ... 
