在UNIX和Windows中关闭磁盘I/O缓冲

     现代操作系统对磁盘读写一般都提供提供了内存缓冲机制,通常分为直写(write through)和回写(write back)两种方式。直写就是操作系统确保写到磁盘中,系统调用(比如write()函数)才返回;回写可以理解为数据写到内存磁盘缓冲中即返回,由操作系统决定在合适的时间写到磁盘上。所以如果系统出现突然断电等故障,回写的数据可能无法保证其已经写到磁盘上,这对某些应用是不可接受的(比如数据库系统)。
    一般在操作系统中,为保证效率,缺省都是采用回写方式。在C语言中,通常可以调用fflush()来把缓冲数据写到磁盘。

      先看看UNIX中是怎么处理的。
   UNIX主要使用sync, fsync, fdatasync函数来控制磁盘缓冲读写。对于传统的Unix系统实现,内核中都有一个buffer cache page cache,磁盘I/O的数据都通过它来传递。延迟写(delayed write):当向一个文件写数据时,数据通常被内核拷贝到它的缓冲区,排好序,在将来的某个时刻写到磁盘。为确保磁盘上文件系统和buffer cache中内容的一致性,提供了sync, fsync, fdatasync三个函数。
   int fsync(int filedes);
   int fdatasync(int filedes);
   void sync(void);

   sync函数只是简单地将所有已修改的块缓冲排入写队列,并且返回,它不必等待磁盘写操作发生。通常Unixwrite只是将数据放到写队列中,写操作在将来某时发生。为了保证有规则地清空内核的块缓冲,系统的一个守护进程(通常称作update)定期地(通常每隔30)调用syncSync命令也调用sync函数。
    fsync
函数在返回之前要等待磁盘写操作完成。使用fsync的目的是向应用程序,比如数据库,保证修改的数据块已经写到磁盘。
   fdatasync
函数类似于fsync,但它只影响文件的数据部分。fsync同时更新文件的属性。

       另外,UNIX创建文件也提供了一些选项。比如,可以在open函数中指定
O_DSYNC选项,这样每次写都要等上次物理I/O完成,如果不影响读取新写入的数据,则不等待文件属性更新。
        在windows中,也有相应的机制,在CreateFile函数中,指定FILE_FLAG_WRITE_THROUGH标记,相当于UNIX的O_DSYNC选项。不过,此时的行为与fdatasync相同,写数据但不写文件的metadata。要同时写metadata,可以使用FlushFileBuffers()函数,相当于UNIX中的fsync函数。
       
在windows中,要关闭磁盘缓存,可以使用FILE_FLAG_NO_BUFFERING 选项。
     
  

你可能感兴趣的:(Windows操作系统)