3

Linux 2.6 カーネルを実行する ARM デバイスを使用しており、RAM の合計は 64 MB です。

アプリ プロトコルとして RS485 および ModBus を介して、Linux ボックスによってクエリされるメーターで構成されるデータ ソースがあります。

これらの値を読み取り、json オブジェクトを作成してから、特定のサーバーに HTTP POST するという別のタスクがあります。

ネットワーク操作は、特に GPRS カバレッジが低い場合、シリアルよりも遅くなる可能性があります。

並行性が必要です。プログラムは C で書かれています。

どちらの方法で並行性を確保しますか? select() を使用するか、pthreads を使用しますか?

4

3 に答える 3

5

この特定のアプリケーションを分析すると、pthread の選択に関連する質問は 1 つだけです。

  1. センサー リーダーとネットワーク ライターは、アドレス空間を共有する必要がありますか?

この場合、答えは明らかに「いいえ」だと思います。もちろん、それが唯一の可能な質問ではありませんが、唯一の密接な質問です。個別のプロセスを好む理由は次のとおりです。

  1. アプリケーションの 2 つの部分に共通のコードはありません。RS485 は HTTP/JSON とは大きく異なります
  2. 責任の分離: RS485 側が UART で待機している場合、本当に HTTP 側をブロックしますか?
  3. OSにその仕事をさせるので、あなたがする必要はありません。pthreadsを使用する場合、カーネルが無料で行う多くの同期とプリエンプションを処理する必要があり、書く必要のないコードには新しいものはありませんバグ。

さらなる分析には、あなたが与えた以上の詳細が必要ですが、選択について考えるための追加の方法が 1 つあります。スレッドは、プロセス モデルのいくつかの制限を軽減するために発明されました。これらの制限に達することがわかっている場合を除き、別のプロセスを使用してください。

コメントに応じて追加:

私はpsusiの提案されたデザインに半分同意します。必要なプロセスは 2 つだけです。1 つのプロセス (センサー リーダーとしましょう。これは適切な選択です) は、1 つの HTTP 送信者のみをフォークします。2 つのプロセスは、パイプのような従来の IPC を使用して通信できます。センサー プロセスは、パイプにデータがある場合にデータを送信し、子 (http) プロセスはそれを json にパックして途中で送信します。

2 つの長寿命プロセスしか必要とせず、おそらく pthread 実装とほぼ同じ量のコアを使用し、正しく行うのははるかに簡単です。

于 2013-09-09T18:48:24.163 に答える
1

select() は、複数のスレッドに伴うコンテキストの切り替えを回避するため、より効率的です。また、データをコピーする必要がないため、スレッドは個別のプロセスよりも効率的です (共有メモリをセットアップしない限り、その時点でスレッドを使用した方がよいでしょう)。ただし、select() のようにノンブロッキング I/O を記述することは、実行が難しく、正しく行うのが難しく、複数のスレッドによるマルチタスキングを楽しむことができません。また、特に HTTP POST の半分を自分で作成するのではなく、curl を使用できるため、複数のプロセスが最も簡単な実装になる可能性があります。

于 2013-09-10T03:11:52.670 に答える
0

なぜ同時実行が必要なのですか? メーターは厳密な時間間隔でポーリングする必要がありますか?

答えが「はい」の場合: 2 つのプロセスを使用します。1 つはメーター データをポーリングして nand ストレージのリング バッファーに書き込み、もう 1 つはリング バッファーからデータを読み取り、HTTP データを送信します。

答えが NO の場合: 並行性と非ブロックはまったく必要ありません。main() で大きなループを使用するだけで十分です。

于 2013-10-08T08:25:07.403 に答える