详解文件的写入和文件同步

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/UmdCoding/article/details/52328624

为了提高文件的写入效率,在现代操作系统中,当用户调用write函数,将一些数据写入到文件的时候,os通常会将写入数据暂时保存在一个内存缓冲区里面(例如,unix系统实现在内核中设有缓冲区高速缓存页高速缓存,当我们向文件写入数据时,内核通常先将数据复制到缓冲区中,然后排入队列,晚些时候再写入磁盘),这种方式称为延迟写,等到缓冲区的空间被填满,或者超过了指定的时限,或者内核需要重用缓冲区存放其它磁盘块数据时,才会真正将缓冲区中的所有数据写入到磁盘里面。

这种做法虽然提高了效率,但也为写入数据带来了安全问题,如果计算机停机,则保存在缓冲区中的写入数据将丢失。为了保持一致性,即向文件写入数据立即真正的写入到磁盘上的文件中,而不是先写到内存缓冲区里面,则我们需要采取文件同步

一般unix系统提供了3个同步函数 sync,fsync,fdatasync

#include <unistd.h>
int fsync(int fd);
int fdatasync(int fd);  //成功返回0,出错返回-1
void sync(void);

先介绍fsync和fdatasync函数: (详细参加高编P65)
fsync 函数只对由文件描述符fd指定的一个文件起作用,它先将内存缓冲区中的数据(主要是针对于此文件描述符fd的写入数据)给冲洗到磁盘上的缓冲区(注意这里是磁盘上的缓冲区),并且等待写磁盘操作完成(写磁盘操作可以理解为将磁盘缓冲区里面的数据进一步冲洗到磁盘上的数据块中,此数据块为文件所拥有的,此时数据真正存在于文件所拥有的磁盘块上)
fdatasync函数类似于fsync,但是它只影响文件的数据部分,而除数据外,fsync还会同步更新文件的属性(如文件大小等)
注意:这两个函数一般应用在数据库这样的程序中,可以确保立即将内存缓冲区中的数据写入到磁盘上

sync函数:只是将内存缓冲区中的数据冲洗到磁盘的缓冲区上,然后就返回,它并不等待实际的写磁盘操作完成,通常,称为update的系统守护进程周期性的调用sync函数,这就保证了定期冲洗内存缓冲区。

简单理解
文件写入:只是写入到了内存缓冲区,可能还没有写到文件所拥有的磁盘数据块上
文件同步:将缓冲区中的内容冲洗到磁盘上

阅读更多

没有更多推荐了,返回首页