一种技法:使用共享内存拷贝大型数据

一种技法:使用共享内存拷贝大型数据

作者:BlogUpdater |  时间:2020-05-25 |  浏览:704 |  评论已关闭 条评论

蝎子
共享内存(Shared Memory)不仅可以用来和其他进程共享内存数据,它还可以用来隐秘的共享只有你自己才知晓的数据。

举个栗子
下面我们来看一个简单的例子(我忽略了错误检查及各种资源释放代码,因为这个例子只是用来演示一些概念)。在这个例子中,我们演示了你可以同时地映射相同一块共享内存到两个不同的地方。因为被映射的共享内存是同一个,所以如果我们修改其中一个地址上的数据,另一个地址上的数据也会跟着改变,有没有一点像量子纠缠呢?

以上代码将会打印如下的输出:

代码解析
代码中得到的共享内存映射地址会随着每次程序的运行而有所不同,而且我们看到,同一块共享内存得到的地址是指向两个不同位置的指针,而且,尝试修改其中一个地址上的值,会立即影响到另一个地址上的值。

这种现象,源自于共享内存背后的精妙的设计原理。我曾经碰到过这样一个问题:如何对大型数据进行内存拷贝而实际上不用执行拷贝操作。

解决方法就是:先创建一个共享内存块,映射这块共享内存块到一个地址,然后对这个地址执行大型数据写入动作,然后再解除映射。接下来,再将这块共享内存映射到一个新的地址,这样新的地址上已经包含了待拷贝的数据了。

好处在于:这种方法实现了一种将内存数据即时地从一个地方移动到另一个地方的手法。如果需要拷贝的数据十分巨大,则会带来很大的性能收益:因为你无需分配第二块内存区来拷贝数据然后再释放, 甚至内存块都无需进行页换入(Paged In)。

在实际的开发中,我并没有用过这种技法,但是单单是发现这种方法也的确是十分地有趣。

总结
对于追求高性能的开发者来说,他不会放过任何一个榨干机器性能的机会,所以:请将共享内存拷贝大型数据这一招,放入你的工具箱吧。

评论已关闭。