缓存冲洗函数
程序员文章站
2022-03-06 15:00:15
...
传统的 UNIX 系统实现在内核中都设有缓冲区高速缓存或页高速缓存,大多数磁盘 I/O 都通过缓冲区进行。当向文件写入数据时,内核通常首先将数据复制到缓冲区中,然后排入队列,晚些时候再写入磁盘。这种方式被称为“延迟写(delayed write)”。
通常,当内核需要重用缓冲区来存放其他磁盘块数据时,它会把所有延迟写数据块写入磁盘。为了保证磁盘上实际文件系统与缓冲区中内容的一致性,UNIX 系统提供了 sync、fsync 和fdatasync 三个函数。
sync 只是将所有修改过的块缓冲区排入写队列,然后就返回,并不等待实际写磁盘操作结束。通常,称为 update 的系统守护进程周期性地调用(一般每隔 30 秒)sync 函数,这就保证了定期冲洗(flush)内核的块缓冲区。UNIX 命令 sync(1) 也调用 sync 函数。
fsync 函数只对由文件描述符 fd 指定的一个文件起作用,并且等待写磁盘操作结束才返回。fsync 可用于数据库这样的应用程序,这种程序需要确保修改过的块立即写到磁盘上。
fdatasync 类似于 fsync,但它只影响文件的数据部分。而除数据外,fsync 还会同步更新文件的属性。
通常,当内核需要重用缓冲区来存放其他磁盘块数据时,它会把所有延迟写数据块写入磁盘。为了保证磁盘上实际文件系统与缓冲区中内容的一致性,UNIX 系统提供了 sync、fsync 和fdatasync 三个函数。
#include <unistd.h> int fsync(int fd); int fdatasync(int fd); /* 返回值:若成功,返回0;否则,返回 -1 */ void sync(void);
sync 只是将所有修改过的块缓冲区排入写队列,然后就返回,并不等待实际写磁盘操作结束。通常,称为 update 的系统守护进程周期性地调用(一般每隔 30 秒)sync 函数,这就保证了定期冲洗(flush)内核的块缓冲区。UNIX 命令 sync(1) 也调用 sync 函数。
fsync 函数只对由文件描述符 fd 指定的一个文件起作用,并且等待写磁盘操作结束才返回。fsync 可用于数据库这样的应用程序,这种程序需要确保修改过的块立即写到磁盘上。
fdatasync 类似于 fsync,但它只影响文件的数据部分。而除数据外,fsync 还会同步更新文件的属性。