Linux系统下I/O同步的问题

来源:互联网 发布:lds激光测距 知乎 编辑:程序博客网 时间:2024/06/15 07:08

       传统的Unix家族的操作系统在内核里面都有一个缓存区高速缓存或者页面高速缓存,大多数的磁盘I/O都是通过缓冲进行访问的。数据写入文件的时候,其实并没有真正地写入,内核先将数据拷贝到其中的一个缓存区,如果缓存区未写满,则不将数据排到输出队列,而是等待缓存区写满或者当内核需要重新使用这个缓存区的时候,才将该缓存区排到输出队列,此时还没有到磁盘,只有当数据到达队列的队首的时候,才进行实际的I/O操作。这种方式称为延迟写,这种方式的好处是降低了磁盘IO读写的次数,一定程度上提高了系统的性能,但是有好处也有坏处,这种方式降低了文件内容的更新速度,使得待写到文件的数据需要经过一段时间后才能到达磁盘,如果系统突然挂掉了!这种方式会导致数据的丢失!!!所以这种情况下不得不进行数据的同步。

       有三个函数可以实现同步,分别是sync,fsync,fdatasync。在操作系统中的原型如下:

#include<unistd.h>void sync(sync);int fsync(int fd);int fdatasync(int fd);
下面就对这三个函数分别进行说明:

sync函数只是将所有修改过的块缓存区排到输出队列,就返回,这个函数其实并没有实际写入数据到磁盘中。通常所说的update系统守护进程会周期性地调用sync函数,sync命令也调用的是sync函数。

fsync函数只仅仅对文件描述符fd指定的单一文件起作用,并且等待写磁盘操作结束后返回。

fdatasync函数的作用和fsync函数的作用类似,只是此函数只是将数据写入文件,像文件属性之类的并不关心,而fsync函数则会将文件属性等全部写入文件。



0 0
原创粉丝点击