我们希望尽我们所能,以避免在断电期间丢失数据。 所以我决定使用O_DIRECT标志来打开一个文件在磁盘上写入数据。 O_DIRECT是否意味着数据完全绕过OScaching? 如果请求向应用程序返回成功,是否意味着数据必须刷新到磁盘? 如果我在一个文件系统中打开一个常规文件,FS元数据如何? 它也被立即刷新,还是被caching?
顺便说一下,O_DIRECT可以在Windows中使用? 或者在Windows中有没有相应的方法?
O_DIRECT可能会做你想做的,但是会大大减慢你的I / O。
我想只是调用fsync()或fflush(),这取决于你使用直接文件描述符操作还是FILE *应该足够了。
至于元数据问题,它依赖于底层的文件系统,甚至在硬件上,如果你想成为额外的偏执狂。 硬盘(特别是SSD)可能会报告操作已完成,但可能需要一段时间才能真正写入数据。
您可以使用O_DIRECT,但对于许多应用程序来说,调用fdatasync()更方便。 O_DIRECT强加了很多限制,因为IO完全绕过OS缓存。 它绕过读取缓存以及写入缓存。
对于文件系统元数据,您可以在写入文件之后执行fsync()文件。 fsync会刷新文件的元数据,所以你可以确保文件不会消失(或者改变它的属性等),如果之后电源立即丢失的话。
这些机制中的任何一个都取决于您的IO子系统不会向操作系统讲述将数据保存到存储器的情况,而且在很多情况下还依赖于其他硬件相关的事情(例如RAID控制器电池在电源恢复之前没有耗尽)
CreateFile
可以做到这一点。
HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, __in DWORD dwFlagsAndAttributes, __in_opt HANDLE hTemplateFile );
对于dwFlagsAndAttributes
您可以指定FILE_FLAG_WRITE_THROUGH
和FILE_FLAG_NO_BUFFERING
。
如果同时指定了
FILE_FLAG_WRITE_THROUGH
和FILE_FLAG_NO_BUFFERING
,以便系统缓存不起作用,则数据将立即刷新到磁盘而不通过Windows系统缓存 。 操作系统还要求将硬盘的本地硬件高速缓存写入持久性媒体。