`
zhengdl126
  • 浏览: 2538377 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

刷磁盘缓冲:sync、fsync和fdatasync

    博客分类:
  • C
 
阅读更多

传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘 I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满 或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写 (delayed write)(Bach [1986]第3章详细讨论了缓冲区高速缓存)。

延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到 磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,UNIX系统提供了 sync、fsync和fdatasync三个函数。

sync、fsync和fdatasync函数 - Jesse Rei - Jesse Rei 的博客(天道酬勤)

sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。

通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数。这就保证了定期冲洗内核的块缓冲区。命令sync(1)也调用sync函数。

fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。fsync可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。

fdatasync函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。



这里需要特别说明一下的是 目前glibc中fdatasync函数的实现已经和fsync一摸一样了:
/* Synchronize at least the data part of a file with the underlyingmedia. */
int
fdatasync (int fildes)
{
return fsync (fildes);
}


这三个系统调用都简单的介绍完,那么为什么需要它们三个呢?最简单的说是从应用的需求来考虑的,sync是全局的,对整个系统都flush,fsync值针对单个文件,fdatasync当初设计是考虑到有特殊的时候一些基本的元数据比如atime,mtime这些不会对以后读取造成不一致性,因此少了这些元数据的同步可能会在性能上有提升(但fsync和fdatasync两者的性能差别有多大?这个不知道有谁测过没)。所以说三者是根据不同的需求而定的。

分享到:
评论

相关推荐

    函数sync、fsync与fdatasync的总结整理(必看篇)

    在IT领域,尤其是在操作系统和文件系统管理中,`sync`、`fsync`和`fdatasync`是三个至关重要的函数,它们用于确保数据的安全写入和系统一致性。以下是这三个函数的详细说明: 1. **sync函数**: `sync`函数的作用...

    c++面试题网络编程篇

    本文总结了C++面试题网络编程篇中的重要知识点,包括dup和dup2函数、lseek函数、sync、fsync和fdatasync函数、fcntl函数、exit和_exit函数、setjmp和longjmp函数、记录锁、守护进程编程规范等。 1. dup和dup2函数 ...

    linux系统编程(中文)

    - **2.4.1 fsync()与fdatasync()**:`fsync()`用于强制将与文件描述符关联的所有数据写入磁盘;`fdatasync()`只同步文件数据,不包括元数据。 - **2.4.2 数据同步**:为了确保数据一致性,在关键操作前后应调用`...

    Linux系统编程.PDF

    - **2.4.1 fsync()与fdatasync()函数** - **fsync()**:强制将所有修改过的数据写入磁盘。 - **fdatasync()**:仅同步文件数据,不包括元数据。 - **2.4.2 文件锁定与缓存** - **定义**:确保文件数据的一致性。 ...

Global site tag (gtag.js) - Google Analytics