我想使用一个使用文件描述符作为访问其数据的基本手段的库。出于性能原因,我不想在使用这个库的函数之前都将文件提交到磁盘。
我想动态创建(大)数据块,并调用库将它们发送到服务器。就目前而言,我必须将文件写入磁盘,打开它,将 FD 传递给库,等待它完成,然后删除磁盘上的文件。由于我可以按需重新创建 blob(并且它们不会太大以至于导致过多的虚拟内存分页),因此将它们保存到磁盘对我没有任何好处,并且会导致很大的性能损失。
是否可以将 FD 分配给仅作为内存映射实体驻留的数据块?
我想使用一个使用文件描述符作为访问其数据的基本手段的库。出于性能原因,我不想在使用这个库的函数之前都将文件提交到磁盘。
我想动态创建(大)数据块,并调用库将它们发送到服务器。就目前而言,我必须将文件写入磁盘,打开它,将 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 共享内存段、消息队列和信号量数组不会在最后一个进程退出时自动消失。