sync、fsync、fdatasync
传统的UNIX实现再内核都设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将数据复制到一个缓冲区中,如果该缓存区尚未写满, 则不将其排入输出队列,而是的等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后等待其到达队首时,才进行实际的I/O操作。 这种输出方式成为延迟写。
延迟写减少了磁盘的读写次数,但是却降低了文件内容的更新速度,使得本应该已写入文件中的内容还驻留在内存中,如果此时系统发生故障,则有数据丢失的风险。
为了保证磁盘上文件系统与缓冲区高速缓存中内容的一致性,UNIX提供了sync、fsync、fdatasync三个函数。
- sync:将所有修改过的块缓冲区排入写队列,然后返回,不等待实际写磁盘操作结束。通过系统的守护进程(update)会周期性地调用sync函数,保证定期冲洗内核的块缓冲区。
- fsync:只对有文件描述符fileds指定的单一文件其作用,并且等待写磁盘操作结束,然后返回。fsync适用于数据库这样的应用程序。
- fdatasync:类似与fsync,但是它只影响文件的数据部分(fsync还会同步更新文件的属性),部分操作系统不支持fdatasync函数。
This post is licensed under CC BY 4.0 by the author.