我正在开发 ACID 数据库软件产品,我对 WinOS 上的文件持久性有一些疑问。
CreateFile有两个属性,FILE_FLAG_WRITE_THROUGH和FILE_FLAG_NO_BUFFERING - 我是否需要这两个属性来实现文件持久性(即覆盖各种磁盘或操作系统文件缓存)?我在问,因为他们似乎做同样的事情,并且设置FILE_FLAG_NO_BUFFERING会导致WriteFile抛出ERROR_INVALID_PARAMETER错误。
我正在开发 ACID 数据库软件产品,我对 WinOS 上的文件持久性有一些疑问。
CreateFile有两个属性,FILE_FLAG_WRITE_THROUGH和FILE_FLAG_NO_BUFFERING - 我是否需要这两个属性来实现文件持久性(即覆盖各种磁盘或操作系统文件缓存)?我在问,因为他们似乎做同样的事情,并且设置FILE_FLAG_NO_BUFFERING会导致WriteFile抛出ERROR_INVALID_PARAMETER错误。
FILE_FLAG_NO_BUFFERING
指定不缓存。没有读写缓存,所有数据都直接进出您的应用程序到磁盘。如果您读取如此大的块以至于缓存无用,或者您自己进行缓存,这将非常有用。请注意 WhozCraig 关于在使用此标志时正确对齐数据的评论。
FILE_FLAG_WRITE_THROUGH
仅表示在函数返回之前写入应直接写入磁盘。这足以实现 ACID,同时它仍然为操作系统提供了从文件中缓存数据的选项。
使用FlushFileBuffers()
可以提供一种更有效的方法来实现 ACID,因为您可以对文件进行多次写入,然后一次性刷新它们。在一次刷新中组合写入非常重要,因为非缓存写入会将您限制在硬盘驱动器的主轴速度上。对于 7200 rpm 磁盘,每秒最多 120 次非缓存写入或刷新。