2

我的任务是经常和保证将一小部分数据写入文件。它是某种类型的日志记录系统,必须保证将数据保存到磁盘的安全性和速度。我发现刹车出现在经常调用的 Flush() 函数中。所以,我决定摆脱它。

我使用了禁止缓冲和缓存数据的标志(osNoBuffer 和 writeThrough)。在此之后,据我了解,我可以在不使用 flush() 的情况下执行文件 I/O 操作(将数据写入文件)?另一个问题。我如何理解数据肯定是写入磁盘而没有缓存和缓冲的?它是做我想做的事情的正确方式,还是可能是加快频繁文件写入操作的另一种方式?

4

1 回答 1

3

flush()需要这么长时间,正是因为它建立了您正在寻找的保证。文件通常被写入磁盘,磁盘(可能)正在旋转生锈的磁盘。文件物理上分散在这些磁盘的表面上,将读/写头移动到正确的位置需要几毫秒。每秒 50 次刷新意味着每次刷新平均需要 20 毫秒,这接近于您的磁盘机械可以执行的操作。

如果没有刷新,您的写入会组合在一起,因此多次写入只需要读/写头的一次移动。甚至在不检查特定标志的情况下,这必然意味着数据暂时处于危险之中。

仅在软件中,您永远无法知道数据是否真正写入磁盘。我们知道这一点是因为 Sun 在开发 ZFS 文件系统时进行的研究。事实证明,更便宜、更慢的磁盘是关于刷新的,并在数据实际刷新之前返回。您将需要服务器级磁盘来保证这一点。

SSD 在这方面的表现相当不错。他们不需要物理移动写入头。因此,他们不太愿意在潮红上撒谎。

于 2010-10-12T07:56:31.907 回答