fsync vs write系统调用

时间:2012-04-29 09:17:21

标签: filesystems berkeley-db

我想问一个关于什么时候使用像fsync这样的系统调用有用的基本问题。我是初学者,我总是认为写入足以写入文件,而使用write的样本实际上写入文件末尾。

那么像fsync这样的系统调用的目的是什么?

为了提供一些背景我正在使用Berkeley DB库版本5.1.19,并且有很多关于fsync()与仅写作的成本的讨论。这就是我想知道的原因。

1 个答案:

答案 0 :(得分:8)

将其视为一层缓冲。

如果您熟悉标准C调用,如fopenfprintf,您应该已经知道C运行时库本身内发生的缓冲。

刷新这些缓冲区的方法是fflush,它确保信息从C运行时库传递到OS(或周围环境)。

然而,仅仅因为操作系统拥有它,并不意味着它在磁盘上。它也可以在操作系统中缓冲。

这就是fsync所关注的,确保OS缓冲区中的内容物理写入磁盘。

您通常可以在日志记录库中看到这种操作:

fprintf (myFileHandle, "something\n");  // output it
fflush (myFileHandle);                  // flush to OS
fsync (fileno (myFileHandle));          // flush to disk

fileno是一个函数,它为给定的int文件句柄提供基础FILE*文件描述符,并且描述符上的fsync执行最终的刷新级别。

现在 是一项相对昂贵的操作,因为磁盘写入通常比内存中传输慢得多。

  

除了记录库之外,另一个用例可能对此行为很有用。让我看看我是否记得它是什么。对,就是那样。数据库!就像Berzerkely DB一样。您希望确保数据在磁盘上的位置,这是满足ACID要求的一个非常有用的功能: - )