2009-06-08 6 views
50

私は最近、Linuxでメッセージキュー(System VでもPOSIXも大丈夫でしょう)で遊んでいましたが、私のアプリケーションには完璧に見えますが、The Art of Unix Programmingを読んだ後は、良い選択。メッセージキューはLinuxでは廃止されていますか?

http://www.faqs.org/docs/artu/ch07s02.html#id2922148

システムV IPCの上部、メッセージパッシング層は、主として使用から落ちました。共有メモリとセマフォからなる下位層は、同じマシン上で実行されているプロセス間で相互排他ロックとグローバルなデータ共有を行う必要がある状況下では依然として重要なアプリケーションを持っています。これらのSystem V共有メモリ機能は、Linux、BSD、MacOS X、Windowsではサポートされていましたが、従来のMacOSではサポートされていないPOSIX共有メモリAPIに発展しました。

http://www.faqs.org/docs/artu/ch07s03.html#id2923376

のSystem V IPC機能は、Linuxや他の現代のUnixに存在しています。しかし、彼らは遺産であるため、頻繁に行使されることはありません。 Linux版には、2003年半ばの時点でまだバグが存在することが知られています。誰もそれを修正するのに十分な注意を払わないようです。

最近のLinuxバージョンでは、System Vメッセージキューはまだバグがありますか?私は、著者がPOSIXメッセージキューが大丈夫であるべきであることを意味するのかどうか分かりません。

(?)ソケットはほとんど何のために好適なIPCているようですが、私はソケットまたは何か他のものとのメッセージキューを実装するのは非常に簡単なことだろうか見ることができません。あるいは私はあまりにも複雑に考えていますか?

私はそれは私が組込みLinuxで働いていることに関連するかどうかわかりませんか?

答えて

56

個人的に私は、メッセージキューのかなり好きです、彼らはUNIXの世界で間違いなく最も過小利用IPCだと思います。彼らは速くて使いやすいです。

思考のカップル:

  • これのいくつかは単なる流行です。古いものは再び新しいものになる。メッセージキューに輝きのある父親を追加すると、来年の最新かつホットなものになるかもしれません。タブのスレッドではなく、別のプロセスを使用してGoogleのChromeを見てください。突然、1つのタブがロックされても、ブラウザー全体が停止することはないということを人々は喜んでいる。

  • 共有メモリはそれについて彼人のハローの何かを持っています。マシンから最後のサイクルを搾り取ることがなく、MQがわずかに効率が悪い場合、あなたは「本当の」プログラマーではありません。多くの場合、ほとんどのアプリではありませんが、それはまったくナンセンスですが、一度それが保持されると思考を打破することは困難です。

  • MQは、無制限のデータを持つアプリケーションには本当に適切ではありません。パイプやソケットのようなストリーム指向のメカニズムは、そのために使用するほうが簡単です。

  • System Vの亜種は本当に賛成できません。できるだけ一般的にPOSIXバージョンのIPCを使用してください。

+0

7年後のことです。うまくいけばあまり関係はありません。「Ubuntu 14.04」、「linux 3」のメッセージキューのデフォルト設定については疑問です。(キュー内のメッセージ)と '/ proc/sys/fs/mqueue/msgsize_max'は8192(バイト)です - これらは奇妙に小さいです。これらのデフォルトのためのいくつかの厳しい理由はありますか、それともちょっと古いのですか? ( 'man mq_overview'はmsg_maxのハード制限が約32768でかなり高いと言います)私は無限のストリームのようなキューを作成するつもりはありませんが、' msg_max'では100-1000ですか? – xealits

10

私は常にネットワーク経由で私のメッセージを配布するためのオプションを開いたままにしたいので、私は実際にはPOSIXメッセージキューを使用していません。これを念頭に置いて、zeromqAMQPを実装するものなど、より堅牢なメッセージ受け渡しインターフェイスを検討するかもしれません。

0mqについての素晴らしいことの一つは、マルチスレッドアプリケーションで同じプロセス空間から使用された場合、それは非常に高速であるロックなしゼロコピーメカニズムを使用していることです。それでも、同じインターフェースを使ってネットワーク上でメッセージを渡すこともできます。

11

はい、私はメッセージキューがいくつかのアプリケーションに適していると思います。 POSIXメッセージキューはより良いインタフェースを提供します。特に、IDではなくキュー名を指定することができます。これは、障害診断に非常に役立ちます(どちらがどれであるかを簡単に見分けることができます)。

Linuxでは、posixメッセージキューをファイルシステムとしてマウントし、 "ls"で表示することができます。 "rm"で削除することもできます(System Vは、 "ipcs"コマンドと "ipcrm" )

POSIXメッセージキューの最大の欠点
+0

この機能は、UNIXデータグラムソケットでも使用できます。データグラムソケットをファイルにバインドし、POSIXメッセージキューと同じ方法で受信できます。私は 'netcat'を使ってテストデータをデータグラムソケットファイルに送ることさえできます。 – shuva

1

:POSIXメッセージキューは、それselect()と互換性があるように要件ことはありません

  • (これは、QNXシステムでのLinuxでselect()で動作ではなく)
  • それは驚きを持っています。

UNIXデータグラムソケットは、POSIXメッセージキューと同じタスクを実行します。そしてUnix Datagramソケットはソケット層で動作します。 select()/poll()または他のIO待機方法で使用することができます。 select()/poll()を使用すると、イベントベースのシステムを設計する際に利点があります。そのようにビジーループを回避することは可能です。

メッセージキューに驚きがあります。 mq_notify()と考えてください。受信イベントを取得するために使用されます。メッセージ待ち行列について何か知らせることができるように思えます。しかし、実際に何かを通知するのではなく、通知のために登録しています。

、より多くの驚きを約mq_notify()競合状態(mq_receive()mq_notify()の呼び出しの間にいくつかの他のプロセス/スレッドのコールmq_send())を引き起こす可能性がある、それはすべてのmq_receive()後に呼び出さなければならないことです。

メソッド仕様と重複し、場合によっては矛盾する独自の定義を持つのセット全体があります。

同期のためにメッセージキューを使用する必要はありません。 eventfdおよびsignalfdが適しています。

しかし、リアルタイムでサポートされています。それは優先順位の機能を持っています。

Messages are placed on the queue in decreasing order of priority, with newer messages of the same priority being placed after older messages with the same priority. 

しかし、この優先度は、アウトオブバンドデータとしてソケットでも使用できます。

最後に私にとって、POSIXメッセージキューは従来のAPIです。私はいつもPOSIXメッセージキューの代わりにUnix Datagramソケットを好みます。

関連する問題