这三个函数用于实现磁盘数据的同步问题。
Unix操作系统在大部分磁盘(disl)IO操作的时候在内核使用了buffer cache or page cache。当我们向文件写入数据的时候,数据经常被内核复制到缓冲区中,排队地等待被写入disk(磁盘)。这被称为delayed write(延迟写入)。通常当内核需要将buffer用于其他磁盘块的时候,会将所有延迟写入的数据全部写入到disk(磁盘)中去。为了确保disk上的文件系统和buffer cache内容的一致性。系统提供了sync,fsync,fdatasync这些函数。
函数原型如下:
#include <unistd.h>
int fsync(int fd);
int fdatasync(int fd);
//Returns: 0 if OK, -1 on error
void sync(void);
sync
其简单的将所有用于写入已经被修改的块(modified block)排列起来。sync不等待磁盘写入操作的发生。(disk writes to take place).
sync通常被系统守护程序(system daemon)周期性调用(约30秒),被称之为update,这能确保内核block buffers的周期性flush。命令sync(1)也能调用sync函数。
fsync
fsync仅仅适用于单个文件(由fd指定的文件),然后等待磁盘写入操作的完成才返回。fsync在应用程序中可以被用在database(数据库)上,因为数据库需要确保修改的数据已经写入到了刺盘中
fdatasync
fdatasync类似于fsync,只是仅仅影响文件的数据区域。和fsync一样,文件的属性也会被同步更新。
本文深入探讨Unix操作系统中磁盘数据同步机制,包括sync, fsync和fdatasync函数的作用,以及它们如何确保文件系统与缓存内容的一致性。重点解析延迟写入原理和内核buffercache的运作方式。
542

被折叠的 条评论
为什么被折叠?



