sync同步

传统的UNIX系统实现在内核中设有缓冲区高速缓存和页高速缓存, 大多数磁盘I/O都通过缓冲区进行. 当我们向文件写入数据时, 内核通常先将数据复制到缓冲区中, 然后排入队列, 晚些的时候再写入磁盘. 这种方式被称为延迟写(delayed write).
通常, 当内核需要重用缓冲区来存放其他磁盘数据时, 它会把所有延迟写数据写入磁盘. 为了保证磁盘上实际文件系统与缓冲区中内容的一致性, UNIX系统提供了sync, fsync和fdatasync三个函数.

  • sync
    sync只是将所有修改过的块缓冲区排入写队列, 然后就返回, 它并不等待实际写磁盘操作结束.
    通常, 成为update的系统守护进程周期性地调用(一般每隔30秒)sync函数. 这就保证了定期冲洗(flush)内核的块缓冲区.

  • fsync
    fsync只对有文件描述符fd指定的一个文件起作用, 并且等待写磁盘操作结束才返回. fsync可用于数据库这样的应用程序, 这种应用程序需要确保修改过的块立即写到磁盘上.

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

  • fsync与fdatasync区别
    除了同步文件的修改内容(脏页),fsync还会同步文件的描述信息(metadata,包括size、访问时间等等),因为文件的数据和metadata通常存在硬盘的不同地方,因此fsync至少需要两次IO写操作,多余的一次IO操作,根据Wikipedia的数据,当前硬盘驱动的平均寻道时间(Average seek time)大约是3~15ms,7200RPM硬盘的平均旋转延迟(Average rotational latency)大约为4ms,因此一次IO操作的耗时大约为10ms左右。Posix同样定义了fdatasync,放宽了同步的语义以提高性能, fdatasync的功能与fsync类似,但是仅仅在必要的情况下才会同步,因此可以减少一次IO写操作。

  • fflush
    标准IO函数(如fread,fwrite等)会在内存中建立缓冲,该函数刷新内存缓冲,将内容写入内核缓冲,要想将其真正写入磁盘,还需要调用fsync。(即先调用fflush然后再调用fsync,否则不会起作用)。fflush以指定的文件流描述符为参数(对应以fopen等函数打开的文件流),仅仅是把上层缓冲区中的数据刷新到内核缓冲区就返回,

  • msync
    将也冲洗到被映射的文件中.

    • MS_ASYNC
    • MS_SYNC 在返回之前等待写操作完成
    • MS_INVALIDATE 通知操作系统丢弃那些与底层存储器没有同步的页.
  • aio_fsync

总结

  1. 如果是对所有的缓冲区发出写硬盘的命令,应该使用sync函数,但应该注意该函数仅仅只是把该命令放入队列就返回了,在编程时需要注意。
  2. 如果是要把一个已经打开的文件所做的修改提交到硬盘,应调用fsync函数,该函数会在数据实际写入硬盘后才返回,因此是最安全最可靠的方式。
  3. 如果是针对一个已经打开的文件流操作,则应该首先调用fflush函数把修改同步到内核缓冲区,然后再调用fsync把修改真正的同步到硬盘。
    Linux、unix在内核中设有缓冲区、高速缓冲或页面高速缓冲,大多数磁盘I/O都通过缓冲进行,采用延迟写技术。

sync:将所有修改过的快缓存区排入写队列,然后返回,并不等待实际写磁盘操作结束;
fsync:只对有文件描述符制定的单一文件起作用,并且等待些磁盘操作结束,然后返回;
fdatasync:类似fsync,但它只影响文件的数据部分。fsync还会同步更新文件的属性;
fflush:标准I/O函数(如:fread,fwrite)会在内存建立缓冲,该函数刷新内存缓冲,将内容写入内核缓冲,要想将其写入磁盘,还需要调用fsync。(先调用fflush后调用fsync,否则不起作用)。

先关宏
open
O_SYNC
函数open的参数O_SYNC/O_DSYNC有着和fsync/fdatasync类似的含义:使每次write都会阻塞等待硬盘IO完成。
O_SYNC 使每次write等待物理I/O操作完成,包括由write操作引起的文件属性更新所需的I/O。
O_DSYNC 使每次write等待物理I/O操作完成,但是如果该写操作并不影响读取刚写入的数据,则不需等待文件属性被更新。

fcntl
O_SYNC wait for writes to complete (data and attributes)
O_DSYNC wait for writes to complete (data only)
O_RSYNC synchronize reads and writes
O_FSYNC wait for writes to complete (FreeBSD and Mac OS X only)
O_ASYNC asynchronous I/O (FreeBSD and Mac OS X only)

aio_fsync

MS_SYNC

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值