原文地址:https://www.douyacun.com/article/5346fecbca9c98ddeb6290c06a5a9a36
#include <unistd.h>
int fsync(int fd);
int fdatasync(int fd);
fysnc 除了同步文件的修改内容(脏页),还会同步文件的描述信息(metadata、包括size、访问时间st_atime、st_mtime等),因为文件数据和metadata通常存在磁盘不同的地方,所以fsync至少需要两次I/O操作
多余的一次IO操作,有多么昂贵呢?根据Wikipedia的数据,当前硬盘驱动的平均寻道时间(Average seek time)大约是3~15ms,7200RPM硬盘的平均旋转延迟(Average rotational latency)大约为4ms,因此一次IO操作的耗时大约为10ms左右。
文件的尺寸(st_size)如果发生变化,是需要立即同步的否则OS一旦崩溃,即使文件的数据部分已同步,由于metadata没有同步,依然读不到修改的内容,最后的饿访问时间和修改时间是不需要每次同步的