据我所了解,如果在阻塞设备文件上使用 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 系统缓存。操作系统还会请求将硬盘的本地硬件缓存写入到持久介质上。
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 系统缓存。操作系统还会请求将硬盘的本地硬件缓存写入到持久介质上。
aio_error()
和aio_return()
等待异步I/O完成,否则我认为你可以使用fsync()
。如果您想保证I/O完成的顺序,我认为O_SYNC
与O_DIRECT
结合使用是有用的。 - user152949