【发布时间】:2012-04-29 09:17:21
【问题描述】:
我想问一个基本问题,即何时使用 fsync 之类的系统调用有用。我是初学者,我一直认为 write 足以写入文件,而使用 write 的示例实际上在最后写入文件。
那么像 fsync 这样的系统调用的目的是什么?
只是为了提供一些背景信息,我正在使用 Berkeley DB 库 5.1.19 版,并且有很多关于 fsync() 与编写成本的讨论。这就是我想知道的原因。
【问题讨论】:
我想问一个基本问题,即何时使用 fsync 之类的系统调用有用。我是初学者,我一直认为 write 足以写入文件,而使用 write 的示例实际上在最后写入文件。
那么像 fsync 这样的系统调用的目的是什么?
只是为了提供一些背景信息,我正在使用 Berkeley DB 库 5.1.19 版,并且有很多关于 fsync() 与编写成本的讨论。这就是我想知道的原因。
【问题讨论】:
把它想象成一层缓冲。
如果您熟悉 fopen 和 fprintf 等标准 C 调用,您应该已经知道 C 运行时库本身中发生的缓冲。
刷新这些缓冲区的方法是使用fflush,它确保信息从 C 运行时库传递到操作系统(或周围环境)。
但是,仅仅因为操作系统有它,并不意味着它在磁盘上。它也可以在操作系统中缓冲。
这就是fsync 负责的工作,确保将操作系统缓冲区中的内容物理写入磁盘。
您通常会在日志库中看到此类操作:
fprintf (myFileHandle, "something\n"); // output it
fflush (myFileHandle); // flush to OS
fsync (fileno (myFileHandle)); // flush to disk
fileno 是一个函数,它为给定的FILE* 文件句柄提供底层int 文件描述符,而描述符上的fsync 执行最后一级的刷新。
现在 是一个相对昂贵的操作,因为磁盘写入通常比内存中传输慢得多。
除了日志库之外,另一个用例可能对这种行为有用。让我看看我是否记得那是什么。对,就是那样。数据库!就像 Berzerkely DB 一样。如果您想确保数据在磁盘上,这是一个非常有用的功能,可以满足 ACID 要求:-)
【讨论】: