2010-09-01 85 views
2

我想使用一個使用文件描述符作爲訪問其數據的基本手段的庫。出於性能原因,我不希望在使用這個庫的函數之前將文件提交到磁盤。如何在OSX上創建沒有支持文件的內存映射文件?

我想創建(大)的數據blob,並調用庫中發送它們到服務器。現在,我必須將文件寫入磁盤,打開它,將FD傳遞到磁帶庫,等待它完成,然後刪除磁盤上的文件。因爲我可以根據需要重新創建blob(而且它們不會太大以至於會導致過多的虛擬內存分頁),所以將它們保存到磁盤上並不會給我帶來任何收益,並且會導致較大的性能損失。

是否可以將FD分配給僅作爲內存映射實體駐留的數據塊?

+0

可能沒有辦法做到這一點。但看看這個問題:http://stackoverflow.com/questions/2822040/system-call-to-map-memory-to-a-file-descriptor-inverse-mmap – Sven 2010-09-01 08:39:36

回答

3

你可以安裝一個內存支持的文件系統http://lists.apple.com/archives/darwin-kernel/2004/Sep/msg00004.html

利用這個機制會增加系統的內存壓力,並可能會被調出,如果內存壓力足夠大。將它作爲配置選項可能是值得的,以防用戶寧願某些其他應用程序擁有內存的第一選擇。

另一種選擇是使用POSIX共享內存段http://opengroup.org/onlinepubs/007908799/xsh/shm_open.html(我沒有使用POSIX共享內存段我自己,如果我正確地理解他們,他們的目的是準確地解決這個問題。)

shm_open()函數創建一個內存對象並返回一個文件描述符。然後您可以使用文件描述符mmap(2),完成您的工作並將文件描述符傳遞給庫。

不要忘記shm_unlink完成後的對象;當最後一個進程退出時,POSIX共享內存段,消息隊列和信號量陣列不會自動消失。

+0

啊哈! shm_open()正是我所需要的。謝謝! – Enquimot 2010-09-01 08:47:26

+0

@Menviciel,感謝您的修正:D我希望我能夠進行修改投票。 – sarnold 2010-09-01 09:02:36

+1

可能需要對此進行試驗,因爲儘管OS X支持POSIX,但您可能需要調整內核參數才能分配合理數量的共享內存。根據您的應用程序,這可能是也可能不是可以接受的(即,我沒有問題調整參數來運行postgres或Oracle,但大多數最終用戶預計安裝時設置爲零)。 – JulesLt 2010-09-01 10:40:28