1

背景:
我想在 C++ 中创建一个自动化框架,一方面“传感器”和“参与者”,另一方面“逻辑引擎”可以连接到“核心”。
“传感器”和“执行器”可能连接到运行“核心”的机器,但有些也可以通过现场总线或普通计算机网络访问。有些可能连续或周期性工作(例如每 100 毫秒一个新值),其他可能工作事件驱动(例如,仅当开关被 [de] 激活时,消息才会带有新状态)。
“逻辑引擎”可以插入到内核中,例如由嵌入式众所周知的脚本语言(Perl、Python、Lua、...)组成。
“核心”将传感器/参与者信息路由到订阅的脚本并调用它们。有些是在事件发生之后,有些是在调度程序中定义的周期性的。

其他要求:

  • 运行此自动化应用程序的系统(“服务器”)也可能非常小(500MHz x86 和 256 MB RAM),或者可能甚至很小(基于 OpenWRT 的路由器),因为功耗是一个问题
    => 效率很重要
    => 多核支持不目前,但我相信它很快就会变得重要 - 所以设计必须支持它
  • 某种故障保存模式必须是可能的,例如两个系统互相监视
  • 应用程序/框架将是 GPL => 所有使用的库必须兼容
  • 服务器将运行 Linux,但跨平台会很好

最大的问题:
这种应用程序/框架的最佳架构是什么?

我的理由:
不要重新发明轮子,我想使用 MPI 来完成所有的事件处理。
这将使我能够专注于相关的东西而不是消息处理,尤其是当两个或多个“服务器”一起工作时(相互看门狗以及每个都有一些传感器和参与者连接)。每个传感器和参与者处理程序以及逻辑引擎本身只需要实现一个预定义的基于 MPI 的接口,因此可以保存崩溃。当核心不再响应时,核心可以重新启动。

附加问题:

  • 使用 MPI 甚至可能吗?(它会被使用有点脱离上下文......)
  • MPI的开销会不会太大?我应该使用套接字和线程自己编写吗?
  • 在这种情况下是否有其他可能更适合的库?
4

1 回答 1

1

您应该能够使用 MPI 构建您的系统,但我认为 MPI 过于关注高性能计算。此外,由于它是为 C 设计的,它并不真正适合面向对象的编程方式。IMO 还有其他更适合您需求的方法:

  • Boost ASIO可能非常适合设计您的系统。它既包括网络功能,又有助于事件驱动编程(这可能是设计系统的好方法)。您可以查看Think-Async网页,了解一些使用 ASIO 进行事件驱动编程的示例。

  • 您还可以使用普通线程并从 ASIO 借用网络功能(不使用事件驱动的编程部分)。如果您可以使用 C++11,那么您可以直接使用std::thread所有其他可用的功能(互斥锁、条件变量、期货等)。如果你不能使用 C++11,你总是可以使用Boost Thread

  • 最后,如果你真的想去 MPI,你可以看看Boost MPI。至少您将拥有一种更加 C++ 友好的方式来使用 MPI。

于 2012-07-06T19:30:43.890 回答