如何在OSX上创建没有后备文件的内存映射文件?

时间:2010-09-01 08:21:47

标签: macos unix mmap memory-mapped-files file-descriptor

我想使用一个使用文件描述符作为访问其数据的基本方法的库。出于性能原因,我不想在使用这个库的函数之前将文件提交到磁盘。

我想动态创建(大)数据blob,并调用库将它们发送到服务器。就目前而言,我必须将文件写入磁盘,打开它,将FD传递给库,等待它完成,然后删除磁盘上的文件。由于我可以按需重新创建blob(并且它们不会太大而导致虚拟内存分页过多),因此将它们保存到磁盘不会给我带来任何好处,并且会导致很大的性能损失。

是否可以将FD分配给仅作为内存映射实体驻留的数据块?

1 个答案:

答案 0 :(得分:4)

您可以安装内存支持的文件系统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共享内存段,消息队列和信号量数组不会自动消失。