POSIX O_DIRECT与Windows FILE_FLAG_WRITE_THROUGH和FILE_FLAG_NO_BUFFERING的比较

6
据我所了解,如果在阻塞设备文件上使用 POSIX 的 O_DIRECT 和 open(),那么它的工作方式与在 Windows 上同时使用 CreateFile() 的 FILE_FLAG_WRITE_THROUGH 和 FILE_FLAG_NO_BUFFERING 相同 - 这是我的正确假设吗?
Open:
O_DIRECT 尝试最小化对该文件进行的 I/O 的缓存效果。一般来说,这会降低性能,但在特定情况下很有用,例如当应用程序执行自己的缓存时。文件 I/O 直接完成读写操作,并通过用户空间缓存进行。
Createfile:
如果使用 FILE_FLAG_WRITE_THROUGH,但未指定 FILE_FLAG_NO_BUFFERING,则系统缓存仍然有效,因此数据将被写入系统缓存,但不延迟即刻被刷新到磁盘上。如果同时指定 FILE_FLAG_WRITE_THROUGH 和 FILE_FLAG_NO_BUFFERING,则系统缓存无效,数据将立即刷新到磁盘上而不经过 Windows 系统缓存。操作系统还会请求将硬盘的本地硬件缓存写入到持久介质上。

我不确定,但是使用 O_DIRECT 时你可能还需要 O_SYNC 来确保数据被写入磁盘。似乎 O_DIRECT 跳过了页面缓存,对应于 FILE_FLAG_NO_BUFFERING。O_SYNC 可以立即提交数据到磁盘,对应于 FILE_FLAG_WRITE_THROUGH。请告诉我你的想法。 - O.C.
@OrcunC 我使用POSIX AIO,在那里你可以使用aio_error()aio_return()等待异步I/O完成,否则我认为你可以使用fsync()。如果您想保证I/O完成的顺序,我认为O_SYNCO_DIRECT结合使用是有用的。 - user152949
是的,没错。如果你想在Node.js中实现这个,并且需要对齐缓冲区等,你可以使用https://github.com/ronomon/direct-io。 - Joran Greef
1个回答

6

是的,在Windows系统中使用这两个标志将产生与在POSIX系统上使用O_DIRECT非常相似的效果。由于这是两个不同的操作系统,您可以预期没有完全匹配。

然而,除非您试图准确了解文件系统的工作方式,否则从这两个选项中都可以得到“不要缓冲数据,并尽快将其直接写入磁盘”的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接