我想使用一个使用文件描述符作为访问其数据的基本手段的库。出于性能原因,我不想在使用该库的功能之前每次都将文件提交到磁盘。

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

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

有帮助吗?

解决方案

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top