传统的UNIX系统实现在内核中设有缓冲区高速缓存或页高速缓存,大多数磁盘I/O都通过缓冲区进行。

当我们向文件写数据时,内核通常先将数据复制到缓冲区中,然后排入队列,晚些时候再写入磁盘。这种方式被称为延迟写。

通常,当内核需要重用缓冲区来存放其他磁盘块数据时,他会把所有延迟写数据快写入磁盘。

为了保证磁盘上实际文件系统与缓冲区中内容的一致性,UNIX系统提供了sync、fsync和fdatasync三个函数:

#include <unistd.h>

int fsync(int fd);
int fdatasync(int fd);
void sync(void);
  • sync只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。

通常称为update的系统守护进程周期性地调用sync函数。这就保证了定期冲洗(flush)内核的块缓冲区。命令sync(1)也调用sync函数

  • fsync函数只对由文件描述符fd制定的一个文件其作用,并且等待磁盘操作结束才返回。fsync可用于数据库这样的应用程序这种应用程序需要确保修改过的块立即写到磁盘上。
  • fdatasync函数类似与fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。

results matching ""

    No results matching ""