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

tim*_*adh 15 c linux macos

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

干杯蒂姆

tim*_*adh 15

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


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
    }
Run Code Online (Sandbox Code Playgroud)


Die*_*Epp 5

您可能想使用madvise系统调用。MADV_DONTNEED您可以使用或向内核提供有关首先刷新哪些页面的提示MADV_WILLNEED。OS X 还支持一个mmapflag MAP_NOCACHE,它指示内核首先丢弃生成的页面。

  • 我应该注意我正在编写一个 DBMS。这是一个“学术”项目,即。作为高级项目的一部分。作为该项目的一部分,我们正在对我们正在使用的各种文件结构的推荐缓冲方案进行实证工作,即。B+ 树、ISAM、线性散列,这些都是相当标准的,但我们还实现了一些更奇特的东西,例如 B-Tries。每个结构都有自己的建议,关于哪种缓冲方案效果最好,作为该项目的一部分,我的目标是一路测试其中的一些主张。 (3认同)