1

我正在开发 ACID 数据库软件产品,我对 WinOS 上的文件持久性有一些疑问。

CreateFile有两个属性,FILE_FLAG_WRITE_THROUGHFILE_FLAG_NO_BUFFERING - 我是否需要这两个属性来实现文件持久性(即覆盖各种磁盘或操作系统文件缓存)?我在问,因为他们似乎做同样的事情,并且设置FILE_FLAG_NO_BUFFERING会导致WriteFile抛出ERROR_INVALID_PARAMETER错误。

4

1 回答 1

1

FILE_FLAG_NO_BUFFERING指定不缓存。没有读写缓存,所有数据都直接进出您的应用程序到磁盘。如果您读取如此大的块以至于缓存无用,或者您自己进行缓存,这将非常有用。请注意 WhozCraig 关于在使用此标志时正确对齐数据的评论。

FILE_FLAG_WRITE_THROUGH仅表示在函数返回之前写入应直接写入磁盘。这足以实现 ACID,同时它仍然为操作系统提供了从文件中缓存数据的选项。

使用FlushFileBuffers()可以提供一种更有效的方法来实现 ACID,因为您可以对文件进行多次写入,然后一次性刷新它们。在一次刷新中组合写入非常重要,因为非缓存写入会将您限制在硬盘驱动器的主轴速度上。对于 7200 rpm 磁盘,每秒最多 120 次非缓存写入或刷新。

于 2012-11-04T06:39:12.380 回答