2010-02-19 75 views
13

我一直在谷歌搜索的方式來做原始(有時稱爲直接)i/o在mac os下。原始I/O轉動操作系統頁面緩存,以使應用程序更直接地訪問磁盤。這很有用,因爲我使用的一些文件結構在使用LRU頁面替換時效率不高。實現我們需要的頁面替換算法是相當直接的,但首先我們需要關閉os x默認緩衝。在打開文件時,我們已經在Linux下使用O_DIRECT標誌完成了這項工作。有誰知道如何關閉在Mac OS下的頁面緩衝?如何在Mac OS X上執行Raw IO? (即相當於Linux的O_DIRECT標誌)

乾杯 添

回答

11

在閱讀完手冊後,我終於找到了理想的答案。事實證明,mac os實際上與O_DIRECT具有非常相似的機制,但它不是通過fcntl的open函數。特別是有一個名爲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版本號。


最終代碼(GO):

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 
    } 
1

您需要使用open,而不是fopen,我相信真的有你有從的/ dev/rdisk中讀取原始訪問?直接使用

+1

linux下使用這種方法時,你必須先安裝使用「原始」命令,打開塊設備爲原始字符設備我知道設備。你需要在os x下玩類似的遊戲嗎? – 2010-02-19 21:03:00

+0

不是我能想到的。對於每個塊設備,系統中有兩個設備,一個是例如*的/ dev/Disk0上*和其它*的/ dev/rdisk0 * – 2010-02-19 21:05:40

+2

使用open(而不是FOPEN)避免在C庫中的緩衝,但是否完全獨立的形式如何操作系統的頁面高速緩存來操作。如下所述,F_NOCACHE是要走的路。 – benno 2010-05-23 11:30:37

2

您可能想要使用madvise系統調用。您可以通過使用MADV_DONTNEEDMADV_WILLNEED來向內核提供有關要首先刷新哪些頁面的提示。 OS X還支持mmap標誌MAP_NOCACHE,它指示內核首先丟棄結果頁。

+0

+1,O_DIRECT幾乎沒有進入Linux,因爲Linus擔心它不會得到適當的POSIX諮詢服務來吸引任何曝光,最終發生。大多數人只是爲了O_DIRECT而不是使用madvise/fadvise。使用O_DIRECT的唯一理由是在編寫處理100%自己緩衝的RDBMS或類似的時候。 – 2010-02-21 04:49:56

+2

我應該注意我正在寫一個DBMS。這是一個「學術」項目,即。作爲高級項目的一部分。作爲項目的一部分,我們正在爲我們正在使用的各種文件結構推薦緩衝方案進行經驗性工作,即。 B +樹,ISAM,Linear Hashing,這些都是非常標準的,但我們也在實現一些更奇特的東西,比如B-Tries。作爲項目的一部分,我的每個結構都有自己的建議,緩衝方案的效果最好,我的目標是一路測試這些聲明。 – 2010-02-21 06:10:22