IO缓存 -- fsync、fdatasync、sync

2014-07-16 11:17:33   最后更新: 2014-07-16 11:17:33   访问数量:839




传统UNIX实现的内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘IO通过缓冲进行,即当写入文件时,内核通常先将该数据复制到一个缓冲区中,只有当缓冲区写满时才进行实际的IO操作,之中输出方式被称为“延迟写”

延迟写减少了磁盘的读写次数,但降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并未写到磁盘上,甚至当系统发生故障时,这种延迟写可能造成文件更新内容的丢失。

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

int fsync (int fd); int fdatasync (int fd); int sync (void);

 

若成功调用则返回0,否则返回-1

 

  1. sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘结束
  2. fsync只对单一文件起作用(fd指定),并且会等待磁盘写入结束后返回。可以切实保证修改过的块立即写到磁盘上
  3. fdatasync函数类似于fsync,但他只影响文件的数据,而不会像fsync一样同步更新文件属性

 

通常,称为update的系统守护进程会周期性的(一般是30秒)调用sync函数,以保证定期冲洗内核的块缓冲区

  • 注:freeBSD 和 mac os x 不支持fdatasync

 






读书笔记      技术帖      linux      unix      龙潭书斋      apue      unix环境高级编程      fsync      fdatasync      sync     


京ICP备15018585号