需要帮助设计进程间通信层
Posted
技术标签:
【中文标题】需要帮助设计进程间通信层【英文标题】:Need help designing an inter-process comm layer 【发布时间】:2010-06-21 17:43:43 【问题描述】:我的系统中有几个进程需要相互通信。
有些进程需要每秒连续传递 60 次数据块, 还有一些非常零星。
大部分进程都是C#,一个是C++。
都在同一台 Windows 7 机器上运行。
现在每个进程都有自己不同的通信实现(管道、事件和套接字)。 我希望统一到一个通信层中。
您将如何实现这一点? 可能是某种以预期接收者为标头的广播? 您会选择哪种进程通信方法?谢谢,
SW
【问题讨论】:
我认为这些不是同一进程的所有实例?如果是这样,他们交流的“数据块”有多少共性? 不,不同的进程做不同的事情。我不明白关于共性的问题。 我问的原因是你谈论整合到一个单一的层。至少从代码共享的角度来看,所有不同的过程也/彼此发送相同类型的信息,然后添加另一层更有意义。 【参考方案1】:我建议使用ICE,它支持远程对象和消息传递。满足您的费率和带宽需求将毫无问题。它也是跨平台的,支持 C# 或 C++ 以外的语言,为您提供更多其他组件的语言选择。
【讨论】:
【参考方案2】:我正在使用WCF 服务在 .Net 进程与 .Net 和 Java 进程之间进行通信。我发现 WCF 是实现此目的的一种非常简单的方法。
【讨论】:
看起来很有趣,有两个问题:1.它可以处理60hz的传递数据吗,2.它和C++很好玩吗? 这两个问题我都不知道。两个 .Net 进程之间的通信实现可以使用管道进行通信,所以我认为它可以处理速率。对于 .Net 和 Java 之间的通信,我使用的是 TCP/IP,所以我不知道它在那个速率下是否可以正常工作。关于第二个问题,我认为如果您有一个不错的 WebService 库,您将不会遇到问题。我在 .Net 和 Java 之间发送对象,它们可以毫无问题地(反)序列化到 XML 中/从 XML 中序列化。但我没有尝试过使用 C++。【参考方案3】:看看 MSMQ。它是基于套接字的,而且速度非常快。本文介绍如何从 C++ 中使用它:http://msdn.microsoft.com/en-us/library/ms811055.aspx。
您也没有提到您的通信是同步的还是异步的(作者是否必须等待读者的响应?)。你有多个作家和读者吗?它是恒定的 60Hz 还是成串的有呼吸空间,读者可以赶上作者?
数据库表也可以用作队列,并且具有在系统崩溃时保留消息的优点。像 Sqlite 这样的低开销嵌入式引擎非常适合这种情况。
【讨论】:
【参考方案4】:请注意,消息中间件解决方案(如 WCF 和 ICE)是强大的引擎,可为您提供可靠消息传递、消息排序控制、分布式(多机)功能等功能。
它们也相对复杂,可能涉及一定程度的“框架”学习。
如果您的应用程序目前可以可靠地运行,那么最初为您的下一个新功能引入您选择的任何消息传递解决方案并首先在那里证明它可能是一个想法。然后,您可以在必要时对现有流程进行改造(如果...)。
【讨论】:
以上是关于需要帮助设计进程间通信层的主要内容,如果未能解决你的问题,请参考以下文章
Linux进程间通信 -- 信号集函数 sigemptyset()sigprocmask()sigpending()sigsuspend()