我想问一个关于什么时候使用像fsync这样的系统调用有用的基本问题。我是初学者,我总是认为写入足以写入文件,而使用write的样本实际上写入文件末尾。
那么像fsync这样的系统调用的目的是什么?
为了提供一些背景我正在使用Berkeley DB库版本5.1.19,并且有很多关于fsync()与仅写作的成本的讨论。这就是我想知道的原因。
答案 0 :(得分:8)
将其视为一层缓冲。
如果您熟悉标准C调用,如fopen
和fprintf
,您应该已经知道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要求的一个非常有用的功能: - )