• ベストアンサー

メッセージキューのFIFOの保証

Solaris10を使用しています。 プロセスAがメッセージキューXに対してメッセージを投げます。 プロセスBがキューXからメッセージを受け取り、処理をします。 プロセスBは複数プロセス(B-1,B-2・・・)あり、すべてがキューXでメッセージを受け取り処理をします。(A:B=1:多になる) この場合 (1)メッセージキューXのFIFO(先入先出)は普通保証されるでしょうか。 (2)プロセスBはメッセージ取得順にメッセージの割り当てが行われるでしょうか。(つまりB-1が先でB-2が後から取りに行ったらB-1に先にメッセージを渡すのが保証されるかどうか。) (3)上記を行うためには、キューの作成もしくはOSのパラメータの設定が必要か、必要ならどれを設定すればいいか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.3

>「B-1、B-2...が皆同じように口を開けて待っていて、 > キューイングされたら早い者勝ちでデキューする」 > B-1が先でB-2が後から取りに行ったらB-1に先にメッセージを渡すのが > 保証されるかどうか。) マニュアルには,それに関する記述がない (少なくとも私は見つけられなかった) ので,それに頼らないように設計する必要があると思います. Solaris 10 Software Developer Collection - Japanese >> プログラミングインタフェース >> 6.プロセス間通信 >> System V IPC http://docs.sun.com/app/docs/doc/819-0392/6n2qr17j1?l=ja&a=view >> System V メッセージ このマニュアルによると,複数の受け手がいる場合には,メッセージタイプで 宛先を指定するという使い方を想定しているようなので (確か私も昔そういう 作り方をしたと思います),1つのメッセージを複数の受け手が奪い合うという 使い方はそもそも想定していないと思います. それともう一つ問題が….B-k がメッセージを受信し,C-k に送信しようとした が C-k または通信路のトラブルで送信できなかった場合,そのメッセージは 破棄していいんでしょうか? それとも別の C-j に送信すべきなんでしょうか? 後者の場合,B-1 ~ B-n を別プロセスにしておくとかなり面倒なことになると思います. そこで次のようにしてはどうでしょうか? これだと負荷分散も,上記の障害対策もしやすいと思うのですが. ・Bは単一プロセス,マルチスレッドとする. ・C-k ごとに1つの送信スレッドを用意する. ・メインスレッドはメッセージキューからメッセージを取り出し,  負荷状況を考慮して各送信スレッドにメッセージを振り分ける. ・ある送信スレッドiで通信が途絶した場合は,それが送ろうとしていた  メッセージを別の送信スレッドjに割り当てる.  (ただしこの場合,スレッドjが C-j に送信するメッセージの順序が逆転する可能性もある.)

その他の回答 (2)

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.2

> プロセスBの負荷分散(ある特定のプロセスB(たとえばB-1だけ) > に処理が集中することがないようすること)が目的です。 > プロセスB-1からプロセスB-nまでに、それなりに平均的に分散させる形で > 処理をさせたいということです。 プロセスを複数に分けても,それらが同一の CPU 上で実行されるのであれば 意味がないどころか,プロセス切替えのオーバーヘッドの分だけ CPU の負荷が 増えるのではありませんか? それともマルチ CPU のマシンなんでしょうか?

quoth
質問者

補足

言葉が足りなかったようで申し訳ありません。補足させていただきます。 実はプロセスB群はさらにその後に別サーバのプロセスC群と結びついています。 たとえばB-1はC-1へ、B-2はC-2、・・・、B-8はC-8へメッセージを投げるように紐付けされています。このC群はB群とは別サーバーですが、C群の中でも負荷分散を行っており、C-1~C-4までがサーバー1とC-5~C-8までがサーバー2で動くような設計となっています。(Bの動くサーバー0からCの動くサーバー1とサーバー2に対して分散してメッセージを送ると言うことです。) B群の入っているサーバーはそれなりに十分な能力があるので、いまのところ複数立ち上げることでのCPU負荷は気にしていません。 C群へ分散させることを直接プロセスAが行うことは、(機能の混合を避けるため)考えていません。 お手数ですが、よろしくお願いします。

  • DT200
  • ベストアンサー率38% (63/164)
回答No.1

(1) メッセージキューそのものの順序性は保証されるはずです(優先順位を付けなければ)。 (2) デキューするのはBひとつだけで、BがデキューしたメッセージをB-1、B-2に 分配するのでしょうか? それとも、B-1、B-2...が皆同じように口を開けて待っていて、キューイング されたら早い者勝ちでデキューするのでしょうか? (3) Bが処理した結果がキューイングされた順番と同じになるよう、順序性をここで 保証するのであれば、同期や排他などの処理で順序性が保たれるように作りこむ が必要となります。 パラメータに関しては、メッセージの大きさとメッセージ数の上限がやろうと している事に対して十分な値であれば良いと思います。

quoth
質問者

補足

回答ありがとうございます。 (2)については 「B-1、B-2...が皆同じように口を開けて待っていて、キューイングされたら早い者勝ちでデキューする」 を想定しています。 これをすることで、プロセスBの負荷分散(ある特定のプロセスB(たとえばB-1だけ)に処理が集中することがないようすること)が目的です。 プロセスB-1からプロセスB-nまでに、それなりに平均的に分散させる形で処理をさせたいということです。 プロセスBは受け取ったメッセージによって処理時間がまちまちですので、Bの「処理結果」の順序性の保証は不要です。

関連するQ&A