我一直在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)
您可能想使用madvise
系统调用。MADV_DONTNEED
您可以使用或向内核提供有关首先刷新哪些页面的提示MADV_WILLNEED
。OS X 还支持一个mmap
flag MAP_NOCACHE
,它指示内核首先丢弃生成的页面。
归档时间: |
|
查看次数: |
5846 次 |
最近记录: |