赞
踩
传统的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
将也冲洗到被映射的文件中.
aio_fsync
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。