1

背景:
C ++で自動化フレームワークを作成したいのですが、一方では「センサー」と「アクター」、もう一方では「ロジックエンジン」を「コア」に接続できます。
「センサー」と「アクター」は「コア」を実行しているマシンに接続されている場合がありますが、フィールドバスまたは通常のコンピューターネットワークを介してアクセスできる場合もあります。継続的または定期的に動作するものもあれば(たとえば、100ミリ秒ごとに新しい値)、イベント駆動型で動作するものもあります(たとえば、スイッチが[非]アクティブ化された場合にのみ、メッセージに新しい状態が表示されます)。
「ロジックエンジン」は、コアにプラグインできるようなものであり、たとえば、埋め込まれたよく知られたスクリプト言語(Perl、Python、Luaなど)で構成されます。
「コア」は、センサー/アクター情報をサブスクライブされたスクリプトにルーティングし、それらを呼び出します。イベントが発生した直後のものもあれば、スケジューラーで定義されているように定期的にのものもあります。

追加要件:

  • この自動化アプリケーションを実行するシステム(「サーバー」)も非常に小さい(500MHzx86および256MB RAM)か、可能であれば電力消費が問題であるため(OpenWRTベースのルーター)小さい場合があります
    =>効率が重要です
    =>マルチコアサポートはありません今のところ、それはすぐに重要になると確信しています-したがって、デザインはそれをサポートする必要があります
  • ある種のフェイルセーフモードが可能である必要があります。たとえば、2つのシステムが相互に監視している
  • アプリケーション/フレームワークはGPLになります=>使用されるすべてのライブラリは互換性がなければなりません
  • サーバーはLinuxを実行しますが、クロスプラットフォームがいいでしょう

大きな質問:
そのような種類のアプリケーション/フレームワークに最適なアーキテクチャは何ですか?

私の推論:
車輪の再発明をしないために、すべてのイベント処理を行うためにMPIを使用することを考えていました。
これにより、特に2つ以上の「サーバー」が連携して動作する場合(それぞれがいくつかのセンサーとアクターを接続している場合)、メッセージ処理ではなく、関連するものに集中できます。各センサーとアクターハンドラー、およびロジックエンジン自体は、事前定義されたMPIベースのインターフェイスを実装するためにのみ必要となるため、クラッシュを回避できます。コアが応答しなくなったときに、コアがそれぞれ再起動する可能性があります。

追加の質問:

  • それはMPIでも可能でしょうか?(コンテキストから少し外れて使用されます...)
  • MPIのオーバーヘッドは大きすぎますか?ソケットとスレッドを使用して自分で作成する必要がありますか?
  • この場合により適した他のライブラリはありますか?
4

1 に答える 1

1

MPI を使用してシステムを構築できるはずですが、MPI はハイ パフォーマンス コンピューティングに重点を置きすぎていると思います。さらに、C 用に設計されているため、オブジェクト指向プログラミングの方法にはあまり適合しません。IMOには、ニーズにより適した他のアプローチがあります。

  • Boost ASIOは、システムの設計に適している場合があります。これにはネットワーク機能が含まれており、イベント ドリブン プログラミングに役立ちます (システムを設計するための良い方法となる可能性があります)。イベント駆動型プログラミングに ASIO を使用する例については、Think-Async の Web ページを参照してください。

  • また、プレーン スレッドを使用して、ASIO からネットワーク機能を借用することもできます (イベント駆動型のプログラミング部分は使用しません)。C++11 を使用できる場合は、std::thread利用可能な他のすべての機能 (ミューテックス、条件変数、フューチャーなど) を直接使用できます。C++11 を使用できない場合は、いつでもBoost Threadを使用できます。

  • 最後に、本当に MPI を使いたい場合は、Boost MPIをご覧ください。少なくとも、MPI をより C++ に適した方法で使用できるようになります。

于 2012-07-06T19:30:43.890 に答える