isa*_*zan 3 filesystems berkeley-db
我想问一个基本问题,即什么时候使用像fsync这样的系统调用是有用的.我是初学者,我总是认为写入足以写入文件,而使用write的样本实际上写入文件末尾.
那么像fsync这样的系统调用的目的是什么?
只是为了提供一些背景我正在使用Berkeley DB库版本5.1.19,并且有很多关于fsync()与编写的成本的讨论.这就是我想知道的原因.
把它想象成一层缓冲.
如果你熟悉标准的C调用像fopen和fprintf,你应该已经知道缓冲C运行时库本身内发生的事情.
刷新这些缓冲区的方法是fflush确保信息从C运行时库传递到OS(或周围环境).
但是,仅仅因为操作系统拥有它,并不意味着它在磁盘上.它也可以在OS中缓冲.
这就是fsync需要注意的事项,确保OS缓冲区中的内容物理写入磁盘.
您通常可以在日志记录库中看到此类操作:
fprintf (myFileHandle, "something\n"); // output it
fflush (myFileHandle); // flush to OS
fsync (fileno (myFileHandle)); // flush to disk
Run Code Online (Sandbox Code Playgroud)
fileno是一个函数,它为您int提供给定FILE*文件句柄的基础文件描述符,并fsync在描述符上执行最终的刷新级别.
现在这是一个相对昂贵的操作,因为磁盘写入通常比内存中传输慢得多.
除了记录库之外,另一个用例可能对此行为很有用.让我看看我是否记得它是什么.对,就是那样.数据库!就像Berzerkely DB一样.您希望确保数据在磁盘上的位置,这是满足ACID要求的一个非常有用的功能:-)