gpt4 book ai didi

c - 如何在 Mac OS X 上执行 Raw IO? (相当于 Linux O_DIRECT 标志)

转载 作者:IT王子 更新时间:2023-10-29 00:25:24 27 4
gpt4 key购买 nike

我一直在谷歌上搜索一种在 mac os 下进行原始(有时称为直接)i/o 的方法。操作系统页面缓存的原始 I/O 轮流让应用程序更直接地访问磁盘。这很有用,因为我使用的一些文件结构在使用 LRU 页面替换时效率不高。实现我们需要的页面替换算法是相当直接的,但首先我们需要关闭 os x 默认缓冲。我们已经在打开文件时使用 O_DIRECT 标志在 linux 下完成了此操作。有谁知道如何在 mac os 下关闭页面缓冲?

干杯蒂姆

最佳答案

在阅读了更多手册页之后,我终于找到了理想的答案。事实证明,mac os 实际上具有与 O_DIRECT 非常相似的机制,但它不是通过 open 函数,而是通过 fcntl。具体来说,有一个名为 F_NOCACHE 的选项,它允许您为特定的文件描述符打开或关闭缓存,这正是我想要的。参见 http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man2/fcntl.2.html有关您可以使用 fcntl 的 mac 版本执行的其他操作的完整说明,以及其确切用法的解释。我希望这个答案能帮助其他人。


http://lists.apple.com/archives/filesystem-dev/2007/Sep/msg00010.html是一个很好的线程,它解释了 F_NOCACHE 标志如何根据您的 mac os 版本号运行。


最终代码(进行中):

    r1, r2, err := syscall.Syscall(syscall.SYS_FCNTL, uintptr(self.file.Fd()), syscall.F_NOCACHE, 1)
if err != 0 {
fmt.Printf("Syscall to SYS_FCNTL failed\n\tr1=%v, r2=%v, err=%v\n", r1, r2, err)
self.Close()
return false
}

关于c - 如何在 Mac OS X 上执行 Raw IO? (相当于 Linux O_DIRECT 标志),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2299402/

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