我们希望尽我们所能,以避免在断电期间丢失数据。 所以我决定使用O_DIRECT标志来打开一个文件在磁盘上写入数据。 O_DIRECT是否意味着数据完全绕过OScaching? 如果请求向应用程序返回成功,是否意味着数据必须刷新到磁盘? 如果我在一个文件系统中打开一个常规文件,FS元数据如何? 它也被立即刷新,还是被caching?
顺便说一下,O_DIRECT可以在Windows中使用? 或者在Windows中有没有相应的方法?
通过Windows中的常规文件传输1-2兆字节的数据比通过RAM慢吗?
如何在python中获取(MB)文件中tar.gz的大小
为什么在这种情况下read()块?(linux epoll)
bash脚本导航目录子结构,然后对.xml文件进行操作
如果我打算通过多个进程访问文件的多个部分,使用CreateFileMapping和MapViewOfFile的正确方法是什么?
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系统缓存 。 操作系统还要求将硬盘的本地硬件高速缓存写入持久性媒体。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。