7

我需要 2 个不同的程序来处理一组数据。我可以在它们之间建立网络(UDP)连接,但我想以任何方式避免传输整个数据。

这听起来有点荒谬,但是是否可以在这两个程序之间共享某种指针,这样当一个程序更新它时,另一个程序可以简单地获取指针并开始使用它?

我正在使用 Ubuntu 9.10

4

8 回答 8

12

你在谈论 IPC - 进程间通信。有很多选择。

一种是内存映射文件。它接近于做你所描述的。不过,它可能是也可能不是满足您要求的最佳方法。阅读 IPC 以获得一些深度。

于 2010-02-25T22:38:10.140 回答
9

您要查找的内容通常称为“共享内存段”,您访问它的方式因平台而异。

在 POSIX(大多数 Unix/Linux)系统上,您使用 sys/shm.h 中的 shm_*() API。

在 Win32 上,它使用内存映射文件完成,因此您将使用 CreateFileMapping()/MapViewOfFile() 等。

不确定Mac,但您也可以在那里使用 shm_*() 。

于 2010-02-25T22:44:50.187 回答
2

共享内存可以提供任何可用 IPC 形式的最高带宽,但管理起来也有点麻烦——您需要同步对共享内存的访问,就像使用线程一样。如果您真的需要原始带宽,那么它是最好的——但是需要这种带宽的设计通常是在进程之间选择不当分界线的设计,在这种情况下,获得它可能会变得不必要地困难运作良好。

另请注意,管道(例如)更容易使用,并且仍然具有相当大的带宽——它们仍然(通常)在内存中使用内核分配的缓冲区,但它们会自动同步访问它。带宽的损失是因为自动同步需要非常悲观的锁定算法。不过,这仍然不会带来大量开销......

于 2010-02-25T23:29:26.323 回答
1

用于 Unix 风格的 POSIX 共享内存函数。IBM 大型机 (370/xa/esa/Zos) 可以在低级别使用跨内存服务。您还必须考虑您的应用程序是否会扩展到单个处理器之外。

于 2010-02-25T22:40:53.373 回答
1

也许在两个进程之间使用“memcached”作为代理可能会更好,然后每个进程可以在彼此之间交换密钥。

我相信每个键/值对 1024Kb 或更少的限制,但直接的好处是互操作性、稳定性和未来将多台机器上的多个进程连接在一起的能力。

于 2010-02-25T23:29:43.700 回答
1

If you really, really need to do that it's a hint that your two programs may really be changed to one with two threads... (if you have program sources it's a piece of cake to do it).

于 2010-02-25T23:31:44.053 回答
0

不,对不起。我很久以前就听说过一个实验性的操作系统,它有一个非常大的地址空间,它的一部分在一台机器上,而其他部分在其他机器上。它会允许你问什么......

注意:我假设这 2 个程序在不同的机器上运行。如果它们只是不同的进程,您可以使用命名部分来共享数据。

于 2010-02-25T22:37:43.523 回答
0

抛开它可以完成的事实不谈,进程间通信永远不会通过共享资源来完成——更不用说内存空间了。这是灾难的正确方法。

适当的 IPC 是通过适当的通信方式(例如套接字)完成的。共享内存永远不是要走的路。

于 2010-02-25T23:04:23.257 回答