O_SYNC和O_DIRECT标志的使用和作用非常困惑,并且在平台之间似乎有所不同。在Linux手册页(请参见here示例)中,O_DIRECT提供了同步I / O,最大程度地减少了缓存影响,并要求您自己处理块大小对齐。 O_SYNC仅保证同步I / O。尽管两者都保证将数据写入硬盘的高速缓存中,但我认为直接I / O操作应该比普通同步I / O更快,因为它们绕过了页面高速缓存(尽管FreeBSD的open(2)手册页指出:使用O_SYNC时,绕过缓存。请参见here)。
O_DIRECT和O_SYNC标志之间到底有什么区别?一些实现建议使用O_SYNC | O_DIRECT。为什么?
最佳答案
仅O_DIRECT仅 promise 内核将避免将数据从用户空间复制到内核空间,而是直接通过DMA(直接内存访问;如果可能)将其写入。数据不进入缓存。不能严格保证该函数仅在所有数据传输后才返回。
O_SYNC保证在所有数据都已传输到磁盘之前,调用不会返回(就OS所能告知的)。这仍然不能保证数据不在硬盘写缓存中,但是它是操作系统可以保证的。
O_DIRECT | O_SYNC是它们的组合,即“DMA +保证”。
关于io - open(2)中的O_SYNC和O_DIRECT标志如何不同/相似?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5055859/