• ベストアンサー

AF_UNIXのsocketと共有メモリを使ったリングバッファーの速度比較

いま、仕事でlinux上で2つのプロセスを動かし、プロセスの間で、高速で大量のデータの受け渡しが必要なプログラムを作っています。プロセス間の通信は普通の socket で AF_UNIX を使っています。  できるだけ速度を上げたいのですが、AF_UNIXのsocketのかわりに共有メモリを使ってリングバッファーでキューを作ってデータを送るという案が出ました。この方法によって速度の向上は期待できるでしょうか?

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

  • ベストアンサー
  • aid-u
  • ベストアンサー率75% (22/29)
回答No.2

プロセスAからプロセスBへソケットを使用してデータを送信する場合、以下のようにメモリへのread/writeが発生すると思います。 1)プロセスA上のバッファへ送信データを書き込む 2)プロセスA上のバッファよりカーネル上のバッファへコピー 3)カーネル上のバッファよりプロセスB上のバッファへコピー 4)プロセスB上のバッファの受信データを読み込む 共用メモリを使用した場合は、2)および3)のread/write部分を省略できます。 2)および3)の部分は実際にはsend()/recv()を使用して行いますが、send()/recv()はデータのコピーだけではなく送信の制御のための作業を行います(当たり前ですが)。 send()/recv()の制御機構の処理時間と自前の排他制御の処理時間が同程度であれば、大量データのコピー処理を削減できるので速度の向上を期待できるのではないでしょうか。

moritan2
質問者

お礼

ご回答ありがとうございました。 今すでにテストを開始していて、速度が向上していることを確認しました。

その他の回答 (2)

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.3

共有メモリを使って速度の向上は期待できると私も思います。 が、そもそも送り側と受け側のプロセスが同一マシン上で 同時に動作できるのか?ということは考慮されているのでしょうか。 送り側・受け側が同一マシン上で動くと、双方の動作によって、 CPUの奪い合いになり、動作速度が上がらない可能性があります。 仮に、その実装でOKだったとしても、受け側のプロセスが2つに なったら、破綻するようなシステムで良いのかなど、後々のことまで 考えて設計したほうが良いと思います。 2プロセスなら、DualCoreなら問題ないかもしれませんが。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

大容量データということで、ソケットのバッファを十分大きく取っていたとして、ソケットの場合、送り側の送信バッファと受け側の受信バッファが必要ですが(プロセスの特性によっては同じサイズを確保する必要はないわけですが)、共有メモリを使った場合だと1つでいいので、同じメモリ使用量の場合だと2倍の大きさのバッファを取れることになります。また、排他制御も自分ですることになるので、プロセスの実行状態と待ち状態を自分で細かく制御できるわけですから、速くできると思います。 データ量とバッファサイズの比にもよるのかな。ソケットでも、データが全部入りきれるだけのバッファが取れるのであれば、共有メモリ化による速度向上は、プログラムが複雑になるデメリットを上回らないのではないかなあ。

moritan2
質問者

お礼

ご回答ありがとうございます。 それなりの効果は期待できるのでね。 期待ができるのならやってみたいと思います。手間は、sendとrecvの代用品を作って、同じ名前で使えるようにしてやれば、ソケットの生成部分だけなので、たいしたことはないと思います。 しかし、最初から共有メモリを使うようにシステム全体を設計していればもっとシンプルにできたのですが、いまから変更だとsendとrecvをエミュレーションするような仕様にしなければならないので、その分は効率が悪いですね。

moritan2
質問者

補足

脱字でした それなりの効果は期待できるのでね。 ↓ それなりの効果は期待できるのですね。

関連するQ&A

  • PictureBoxのダブルバッファリングについて

    長文、失礼致します。 私は現在、趣味でRPGを作っているプログラム初心者です。 開発環境はVB2005 ExpressEditionです。 ゲーム中の描画処理は全て1つのPictureBoxで行っています。 PictureBoxのサイズは544×416ピクセルで、描画する画像はGIFやJPEGです。 そして、描画速度がちょっと遅いのが気になっています…。 (縦64、横58ピクセルのキャラが、2cmくらい移動するのに1秒くらい掛かります) どうにか描画速度を速くできないか調べたところ、 ダブルバッファリングという手法を見つけました。 それについて調べたところ、VB2005ではデフォルトでダブルバッファが有効になっているらしい事が分りました。 しかし、以下のように確認したところ「False」と表示され、ダブルバッファが有効になっていないようでした。 Me.Text = Me.GetStyle(ControlStyles.OptimizedDoubleBuffer) また、フォームのロード時に以下のように記述しても、描画速度に変化は見られませんでした。 Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True) Me.SetStyle(ControlStyles.UserPaint, True) Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True) ここで質問なのですが、既にダブルバッファリングされてこの程度の描画速度なら、もっと高速にするには、やはりWin32APIやDirectX等を使うしか方法が無いでしょうか…? あと、現在使っているPCの仕様です。 OS : Windows Vista Home Basic CPU : Celeron(1.73GHz) メモリ : 1GB 何だか色々と叩かれそうな予感がしますが、 ご回答のほど、宜しくお願い致します。

  • SDメモリとSDHCメモリの速度差について

    今使っているデジカメ(IXY DIGITAL)で、SD変換アダプタに刺したMicroSDメモリを使っています。 撮影自体は問題ないのですが、書き込み・読み込みが少々遅く感じます。 特に画像のプレビューで前後送りをする際、一瞬間がある感じです。 そこで質問です。 ・MicroSDメモリ+SD変換アダプタという使い方は、速度面での弊害はあるのでしょうか? ・このメモリをSDHCに変えた場合、レスポンスの向上は見込めるのでしょうか? なおMicroSDは、アイオーデータ社のSDMC-2G/Aと言う製品で、「7MB/sの高速転送」を謳った製品でした。 以上、ご回答よろしくお願いいたします。

  • VB.NETによるプロセス間通信

    VB.NETにおいて、2つのプロセスを起動し、その間のデータの受け渡しを行いたいのですが、 ファイルでは速度が遅すぎて、別の手法を探しています。なるべく簡単で実装できる方法を知りたい です。ちなみに受け渡すデータのサイズですが、数十バイト程度です。よろしくお願いいたします。

  • LinuxのTCPIP

    LinuxのTCPIP実装についてご教示ください。 (C言語をベースとして記載します) 例えば、Kernelとしてはデータを受信していて、アプリケーションがrecv()等の関数で データを引き抜いていない状態でのSocketのCloseはRSTの送信になりFINにはならないと 理解しています。 このとき、send()にデータが残っていた場合でもRST送信するのだから、 送信バッファのデータは破棄され、送信されないというKernel側の実装になっている という理解で良いのでしょうか? #送信バッファのデータというのは、アプリケーション側がsend()しており、実際にパケットは #送信されていない状態(パケットキャプチャされていない状態)としてください 手元で試していると、受信バッファにデータが残っている、かつ送信バッファにも 残っている場合はRST送信され、送信バッファにあるデータも送信されない 受信バッファにデータが残っていない状態で送信後すぐにCloseしても送信が完了してから FINされるように見えています。 ずらずらと書いたのですが、要は受信バッファにデータがある・なしでClose()の挙動が変わり RST送信か、FIN送信になるというのはWeb上でKernelの実装によるものというのを 見つけましたが、その状態、かつ送信バッファにデータが残っている場合は、 RSTだと送信されず、FINだと送信されないという違いがあるので、 Kernel側の意図された実装なのかどうかを知りたいです。

  • ネット バッファリング速度 遅すぎる

    YouTubeの動画の再生が、バッファリングが遅く途中で止まり とてもストレスがたまりますw YouTubeは夜9時頃から混み始めるのは 知っておりますが、パソコンのスペックも悪くないはずなのに 動画が止まってしまい悲しいです。 Windows7 メモリ 16GB 64ビットOS Inter(R) Core(TM) i7-4771 CPU 3.50GHz 3.50GHz フレッツ光の1000Mbpsの契約をしているのですが ネットの速度測定ができるページで何種類か 試してみたのですが2Mbpsだったり1.4Mbps だったり18Mbpsだったりサイトによって異なります。 ちなみにマンションに住んでいます! これも1つの原因なのでしょうか? 1.なぜこんなに遅いのか? 2.改善できるのか? 3.どんな方法で改善できるのか? この3点が知りたいです。

  • 巨大なデータに対する検索に適したデータベース

    巨大なデータベースに対する検索をなるべく高速にこなせるフリーのデータベースを探しています(windows)。 これまでmySQL5.5を使って比較的簡単なデータ検索を行ってきました。 データ構造自体は簡単で例えば下記のように name[char] / weight_gram[int] / country [char] 数桁のintと十数文字の文字列情報をもつエントリーで構成されるテーブルとします。 ただ問題がデータの量で、ある事情で10-100億件のエントリー(rows)があり、そのせいで単純なクエリー、例えば select * from my_big_table where weight in (51000,60000,82000) のような簡単な検索にも非常に時間がかかります。 パーティショニング、インデクスを試し、速度は向上しましたがまだ時間がかかりすぎてしまいます(数分)。 最近になってnoSQLのことを知り。その多くは大量のデータ処理に適していると聞き、簡単な比較なども見ましたがどれが最適なのかいまいちよく分かりません。 特に大半がunix/linux環境用でwindowsで利用可能なものは限られているようです。 そこで -Windows 7/vista 64 bitで動く -フリーで利用できる -大量のデータをもつテーブルに対するquery(検索)が高速 -C++ API (mysql connectorのようなもの)がある の条件に合うnoSQLを教えていただけないでしょうか。

  • 電子工作での高速通信

    電子工作で何枚かの基板を作り、それら基板間を高速通信でつなぎたいと考えています。 画像を送受信することを考えているので、瞬間速度、20M byte/s 程度がほしいです。 USB2.0なら速度的にはOKですが、かなりややこしく、大変そうなので、他の方法を探しています。 使用イメージとしては、  メモリのどこかのバッファに送信データ(2KB程度)を書いておけば、自動的に先方に届く、  先方からのデータはメモリのどこかのバッファ(2KB程度)に自動的に書き込まれる というもので、1対1の通信なので、相手先を選択するなどのややこしいことは無しで使いたいのです。 何かお勧めな方式やデバイスありましたら教えてください。

  • リングバッファについて

    最近学び出した初心者なのですがリングバッファの空きサイズと使用サイズをそれぞれ1つの式で出したいのですが教えていただけないえしょうか。 (wp-rp)&(bufsize-1)というのを聞いたのですがこれだとバッファサイズが2の累乗サイズじゃないとだめみたいで。どなたかおしえてください

  • リングバッファって何ですか

    こんばんわ。 素人な質問ですが教えてください。 『リングバッファ』とは何ですが? <言葉から連想されるイメージは以下のようなものです> 丸いバッファ? 領域サイズが固定されており、容量がいっぱいになったら、 書き込むアドレスを最初の位置に戻し、古い記憶から順に 上書きされていくもの…? 詳しく教えて頂きたく思います。 お願い致します。

  • パソコンのUSBでRS232Cを高速で使用する方法

    教えてください。 例えば以下の商品を使って、win10でボーレート250kbps で使用することはできるでしょうか。 「"1Mbps"データ転送速度を保証」とあったり 「プログラマブルボーレートを75bpsから"128000bps"まで向上でき、高効率で働けます。」と、記載があり、どちらがmax速度なのかわかりません。 <商品> https://www.amazon.co.jp/dp/B00QUZY4UG/ 開発環境は VS2017 .net Socket クラスを使用します。