gpt4 book ai didi

io - open(2) 中的 O_SYNC 和 O_DIRECT 标志有何不同/相似?

转载 作者:行者123 更新时间:2023-12-02 19:30:23 27 4
gpt4 key购买 nike

O_SYNC 和 O_DIRECT 标志的使用和效果非常令人困惑,并且在不同平台之间似乎有所不同。从 Linux 手册页(参见示例 here )来看,O_DIRECT 提供同步 I/O,最大限度地减少缓存影响,并要求您自己处理 block 大小对齐。 O_SYNC 只是保证同步 I/O。虽然两者都保证数据写入硬盘的缓存,但我相信直接 I/O 操作应该比普通同步 I/O 更快,因为它们绕过了页面缓存(尽管 FreeBSD 的 open(2) 手册页指出:使用 O_SYNC 时会绕过缓存。请参阅 here )。

O_DIRECT 和 O_SYNcflags之间到底有什么区别?一些实现建议使用 O_SYNC | O_DIRECT。为什么?

最佳答案

O_DIRECT 本身仅 promise 内核将避免将数据从用户空间复制到内核空间,而是通过 DMA(直接内存访问;如果可能)直接写入。数据不会进入缓存。不严格保证该函数仅在所有数据传输完成后才返回。

O_SYNC 保证在所有数据都传输到磁盘之前(据操作系统所知),调用不会返回。这仍然不能保证数据不在硬盘写入缓存中的某个位置,但它是操作系统可以保证的。

O_DIRECT|O_SYNC 是这些的组合,即“DMA + 保证”。

关于io - open(2) 中的 O_SYNC 和 O_DIRECT 标志有何不同/相似?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5055859/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com