`
zhengdl126
  • 浏览: 2513296 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

刷磁盘缓冲:sync、fsync和fdatasync

    博客分类:
  • C
 
阅读更多

传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘 I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满 或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写 (delayed write)(Bach [1986]第3章详细讨论了缓冲区高速缓存)。

延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到 磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,UNIX系统提供了 sync、fsync和fdatasync三个函数。

sync、fsync和fdatasync函数 - Jesse Rei - Jesse Rei 的博客(天道酬勤)

sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。

通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数。这就保证了定期冲洗内核的块缓冲区。命令sync(1)也调用sync函数。

fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。fsync可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。

fdatasync函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。



这里需要特别说明一下的是 目前glibc中fdatasync函数的实现已经和fsync一摸一样了:
/* Synchronize at least the data part of a file with the underlyingmedia. */
int
fdatasync (int fildes)
{
return fsync (fildes);
}


这三个系统调用都简单的介绍完,那么为什么需要它们三个呢?最简单的说是从应用的需求来考虑的,sync是全局的,对整个系统都flush,fsync值针对单个文件,fdatasync当初设计是考虑到有特殊的时候一些基本的元数据比如atime,mtime这些不会对以后读取造成不一致性,因此少了这些元数据的同步可能会在性能上有提升(但fsync和fdatasync两者的性能差别有多大?这个不知道有谁测过没)。所以说三者是根据不同的需求而定的。

分享到:
评论

相关推荐

    函数sync、fsync与fdatasync的总结整理(必看篇)

    下面小编就为大家带来一篇函数sync、fsync与fdatasync的总结整理(必看篇)。小编觉得挺不错的。现在就分享给大家。也给大家做个参考。一起跟随小编过来看看吧

    s3-folder-sync:围绕s3-sync的命令行包装器

    s3fsync --key={yourawskey} --secret={yourawssecret} --bucket={yourawsbucket} --region={yourbucketregion} 如果需要与存储桶中的子文件夹同步,请使用以/结尾的prefix参数: s3fsync --prefix=subfolder/ . ...

    libeatmydata:libeatmydata-因为fsync()应该是no-op

    fsync()变为NO-OP,O_SYNC被删除等。 这个想法是在测试中使用,以在不需要真正耐用性的情况下获得更快的测试运行速度。 不要在关心软件存储内容的软件上使用libeatmydata。 由于某种原因,它被称为lib EAT-MY-...

    toom-study

    SAVE:根据条件,调用fsync或fdatasync函数,将AOF文件保存到磁盘中。两个步骤都需要根据一定的条件来执行,而这些条件由AOF所使用的保存模式来决定。 Redis目前支持三种AOF保存模式,它们分别是: AOF_FSYNC_NO:...

    Linux内核驱动fsync机制实现图解.docx

    Linux内核驱动fsync机制实现图解.docx

    node.js中的fs.fsync方法使用说明

    同步磁盘缓存。 语法: 代码如下: fs.fsync(fd, [callback(err)]) 由于该方法属于fs模块,使用前需要引入fs模块(var fs= require(“fs”) ) 接收参数: fd 文件描述符 callback 回调,传递一个异常参数err ...

    文件夹同步软件fsync中文注册版

    好用的文件夹比较,同步软件,适用于所用软件及数据增量备份恢复。

    linux笔记相关vim命令

    linux笔记相关vim命令

    Understanding the Linux Kernel

     sync()、fsync()和fdatasync()系统调用  第十六章访问文件  读写文件  内存映射  直接I/O传送  异步I/O  第十七章回收页框  页框回收算法  反向映射  PFRA实现  交换  第十八章Ext2和Ext3文件系统  ...

    UNIX环境高级编程_第二版中文

    3.13 sync、fsync和fdatasync函数  3.14 fcntl函数  3.15 ioctl函数  3.16 /dev/fd  3.17 小结  习题  第4章 文件和目录  4.1 引言  4.2 stat、fstat和lstat函数  4.3 文件类型  4.4 设置用户...

    FSync:用于工作区之间文件同步的 Sublime Text 3 插件

    使用Package Control ,在下面添加存储库(Preferences > Package Control > Add Repository)并正常安装FSync包。 https://github.com/weverss/FSync 如果您没有安装 Package Controll,请参阅进行安装。

    UNIX环境高级编程(第二版中文)

    3.13 sync、fsync和fdatasync函数 61 3.14 fcntl函数 62 3.15 ioctl函数 66 3.16 /dev/fd 67 3.17 小结 68 习题 68 第4章 文件和目录 71 4.1 引言 71 4.2 stat、fstat和lstat函数 71 4.3 文件类型...

    unix环境编程电子书

    50 3.7 read函数 53 3.8 write函数 54 3.9 I/O的效率 54 3.10 文件共享 56 3.11 原子操作 59 3.12 dup和dup2函数 60 3.13 sync、fsync和fdatasync函数 61 3.14 fcntl函数 62 3.15 ioctl函数 66 ...

    UNIX环境高级编程

    3.13 sync、fsync和fdatasync函数 61 3.14 fcntl函数 62 3.15 ioctl函数 66 3.16 /dev/fd 67 3.17 小结 68 习题 68 第4章 文件和目录 71 4.1 引言 71 4.2 stat、fstat和lstat函数 71 4.3 文件类型...

    Linux系统调用fsync函数详解.docx

    Linux系统调用fsync函数详解.docx

    fsync-encode-decode:用于特定数据突发格式的软件调制解调器

    fsync-编码-解码用于特定数据突发格式的软件调制解调器该库支持以 1200 和 2400 bps 对 Kenwood 的 FleetSync 和 FleetSync II 格式进行解码(编码将在以后的版本中添加)。 (其各自所有者的所有商标财产) GPL ...

    redis-7.0.10.tar.gz

    12. 改进 fsync 以避免大量写入到磁盘。 13. BITSET 和 BITFIELD SET 仅在值实际更改时传播 。 14. 当客户端被模块计时器解除阻塞时改善延迟。 15. 当 redis 从空启动时始终创建一个基本 AOF 文件。 16. 本在 repl-...

    UNIX环境高级编程(第四章)

    第4章 文件和目录 54 4.1 引言 54 4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 ...4.24 sync和fsync函数 87 4.25 文件存取许可权位小结 88 4.26 小结 89 习题 89

Global site tag (gtag.js) - Google Analytics