3

プロデューサーと N (N >= 1) ワーカーを持つプログラムを実装しようとしています。これらは、メッセージ キューを使用して通信します。アイデアは、プロデューサーが「タスク」をキューに送信することです。ワーカーは msgrcv() 呼び出しを実行してタスクを取得し、コードを実行します。ワーカーがタスクを完了すると、計算の結果がキューに送信されます。プロデューサーはこのメッセージを受け取り、結果を保存します。

私は POSIX メッセージ キューを使用しており、プロデューサーとワーカーは同時に動作します。

このプログラムの背後にある問題は、通信を危険にさらすシナリオが存在することです。各メッセージのサイズは最大 5000 バイトです。UNIX システムでは、キューの最大サイズは ~16000 バイトです。

シナリオは次のとおりです。キューに 3 つのタスクがあります (5000*3 = 15000 バイト)。一部のワーカーは、キューから 1 つのメッセージを取得します (現在、キューには 10000 バイトあります)。ワーカーはタスクの実行を開始し、ワーカーが各タスクで処理する必要のあるバイト数のために、プロデューサーは別のメッセージをキューに送信します (キューは現在満杯です)。タスクが完了すると、ワーカーは結果をキューに送信しようとし、ブロックされます (キューがいっぱいです)。プロデューサーは別のタスクをキューに送信しようとし、これもブロックされます。

このプログラムを 1 人のワーカーだけで実行すると、このシナリオがかなりの確率で発生します。

この状況を回避するためのアイデアはありますか?

4

2 に答える 2

1

キューのサイズ、使用するキューの数、または別のキューイング API を使用できない場合、キューイングするデータを減らすにはどうすればよいでしょうか?

実際のデータは、共有メモリ オブジェクトまたは一時ファイルに配置できます。次に、データをメッセージに入れる代わりに、ファイル名または共有メモリ オブジェクト名と、場合によってはオフセットをメッセージに入れます。プロデューサー プロセスは、結果を受け取った後、それをクリーンアップできます。

必ずしも共有メモリまたは一時ファイルである必要はありませんが、メッセージ以外の場所にデータを配置し、他のプロセスがアクセスするために必要な情報をメッセージに含めるという考え方です。

于 2011-11-21T00:10:42.053 に答える
0

クライアント->サーバー応答に2番目のメッセージキューを使用するか、安全な番号になるように制限(#sent-#received)します。

于 2011-11-20T23:23:43.163 に答える