2010-09-01 89 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