我需要2个不同的程序来处理单个数据集。 我可以在它们之间建立网络(UDP)连接,但我想避免以任何方式传输整个数据。
这听起来有点荒谬,但有可能在这两个程序之间共享某种指针,这样当一个更新它时,另一个可以简单地获取指针并开始使用它吗?
我正在使用Ubuntu 9.10
答案 0 :(得分:12)
你在谈论IPC - 进程间通信。有很多选择。
一个是内存映射文件。它接近于你所描述的。但是,它可能是也可能不是满足您要求的最佳方法。阅读IPC以获得一些深度。
答案 1 :(得分:9)
您正在寻找的内容通常称为“共享内存段”,您访问它的方式是特定于平台的。
在POSIX(大多数Unix / Linux)系统上,您使用sys / shm.h中的shm _ *()API。
在Win32上,它完成了内存映射文件,所以你将使用CreateFileMapping()/ MapViewOfFile()等。
不确定Mac,但你也可以使用shm _ *()。
答案 2 :(得分:2)
共享内存可以提供任何形式的IPC可用的最高带宽,但是管理也很麻烦 - 您需要同步访问共享内存,就像使用线程一样。如果确实需要原始带宽,那就是最好的 - 但是需要这种带宽的设计往往是在流程之间选择不当的分界线,在这种情况下它可能是不必要地让它运作良好。
另请注意,管道(例如)更容易使用,并且仍然具有相当严重的带宽 - 它们仍然(通常)在内存中使用内核分配的缓冲区,但它们会自动同步对它的访问。带宽的损失是因为自动化同步需要非常悲观的锁定算法。尽管如此,这仍然没有带来巨大的开销......
答案 3 :(得分:1)
POSIX共享Unix风格的内存函数。 IBM大型机(370 / xa / esa / Zos)可以使用低级别的跨内存服务。您还必须考虑您的应用是否会扩展到单个处理器之外。
答案 4 :(得分:1)
也许在你的两个进程之间使用“memcached”作为代理可能会更好,然后每个进程可以在彼此之间交换密钥。
您受到我认为每个键/值对1024Kb或更少的限制,但直接的好处是互操作性,稳定性以及将多台机器上的多个进程连接在一起的未来能力。
答案 5 :(得分:1)
如果你真的,真的需要这样做,这是一个暗示,你的两个程序可能真的被改为一个有两个线程...(如果你有程序源,这是一块蛋糕)。
答案 6 :(得分:0)
不,抱歉。我很久以前就听说过一个具有非常大的地址空间的实验性操作系统,其中部分地址在一台机器上,其他部分在其他机器上。它会让你完全满足你的要求......
注意:我假设2个程序在不同的机器上运行。如果它们只是不同的进程,则可以使用命名的部分来共享数据。
答案 7 :(得分:0)
抛开可以完成的事实,进程间通信永远不会通过共享资源来完成 - 更不用说内存空间了。这是灾难的正确方法。
适当的IPC通过适当的通信方式完成,例如套接字。分享记忆永远不是你想要的。