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()の制御機構の処理時間と自前の排他制御の処理時間が同程度であれば、大量データのコピー処理を削減できるので速度の向上を期待できるのではないでしょうか。
No.3
- 回答日時:
共有メモリを使って速度の向上は期待できると私も思います。
が、そもそも送り側と受け側のプロセスが同一マシン上で
同時に動作できるのか?ということは考慮されているのでしょうか。
送り側・受け側が同一マシン上で動くと、双方の動作によって、
CPUの奪い合いになり、動作速度が上がらない可能性があります。
仮に、その実装でOKだったとしても、受け側のプロセスが2つに
なったら、破綻するようなシステムで良いのかなど、後々のことまで
考えて設計したほうが良いと思います。
2プロセスなら、DualCoreなら問題ないかもしれませんが。
No.1
- 回答日時:
大容量データということで、ソケットのバッファを十分大きく取っていたとして、ソケットの場合、送り側の送信バッファと受け側の受信バッファが必要ですが(プロセスの特性によっては同じサイズを確保する必要はないわけですが)、共有メモリを使った場合だと1つでいいので、同じメモリ使用量の場合だと2倍の大きさのバッファを取れることになります。
また、排他制御も自分ですることになるので、プロセスの実行状態と待ち状態を自分で細かく制御できるわけですから、速くできると思います。データ量とバッファサイズの比にもよるのかな。ソケットでも、データが全部入りきれるだけのバッファが取れるのであれば、共有メモリ化による速度向上は、プログラムが複雑になるデメリットを上回らないのではないかなあ。
ご回答ありがとうございます。
それなりの効果は期待できるのでね。
期待ができるのならやってみたいと思います。手間は、sendとrecvの代用品を作って、同じ名前で使えるようにしてやれば、ソケットの生成部分だけなので、たいしたことはないと思います。
しかし、最初から共有メモリを使うようにシステム全体を設計していればもっとシンプルにできたのですが、いまから変更だとsendとrecvをエミュレーションするような仕様にしなければならないので、その分は効率が悪いですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- CPU・メモリ・マザーボード ゲーミングpcのファンのことについて教えて欲しいです。 6 2023/03/05 07:44
- 物理学 『加(加(加…))速度運動』 9 2022/05/23 07:45
- iPhone(アイフォーン) ディズニープラスのアプリで、映画をあらかじめダウンロードしておき、それを高速バスの中で見ていたんだけ 2 2022/09/15 16:33
- ドライブ・ストレージ USBメモリの転送速度が異常に遅い... 5 2022/05/03 17:49
- Android(アンドロイド) 128GB LAZOS マイクロSDカード 1280円 もっと良い商品ある? 4 2023/02/07 19:42
- 軍事学 トップガンF 18 画面はとても綺麗ですが 古くてあまり実践に使えないのではないのでしょうか 2 2022/05/25 23:56
- 一眼レフカメラ カメラのAFの速度について、SONYα7SIIIに中古で24mm1.4GMのレンズを購入したのです 2 2023/07/31 01:28
- 高校 円運動の質問 4 2022/05/02 04:53
- UNIX・Linux UNIX manページとか見る頻度高いの? 特にCLIばかり使っている人のなかで というかCLIとか 3 2023/05/22 17:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プロセスIDの取得方法について
-
プロセスのアタッチ・デタッチ...
-
バックグラウンドのプロセスの...
-
ウィンドウのタイトルからプロ...
-
タスクマネージャーのプロセス...
-
sleep関数の精度について
-
C#でのbatファイル実行結果取得
-
完全な乱数を生成する方法
-
explorer.exeが異様にメモリを食う
-
怪しいプロセス教えてください。
-
C++のプログラムをバックグラウ...
-
OSPFでプロセスを分ける意義に...
-
ShellExecuteExでハンドルの取得
-
起動中の他のプログラム(orプ...
-
ADOでアクセスのレコードに...
-
Trend Micro Anti-Malware Solu...
-
ShellExecuteが起動したプロセ...
-
C++でシェルを起動
-
Windowsでのfork方法
-
別のプロセスの関数を呼び出す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
C#でのbatファイル実行結果取得
-
プロセスのアタッチ・デタッチ...
-
VB6.0 SHELLで起動...
-
プロセスIDからウィンドウハ...
-
Process.Startの戻り値を後で取得
-
ウィンドウのタイトルからプロ...
-
他のEXEが起動しているかの確認
-
ADOでアクセスのレコードに...
-
怪しいプロセス教えてください。
-
別のプロセスの関数を呼び出す...
-
C++のプログラムをバックグラウ...
-
Linuxでのスレッド間メッセージ...
-
C++でシェルを起動
-
プロセスIDの取得方法について
-
OSPFでプロセスを分ける意義に...
-
非表示になったエクセルは?
-
Windowsでのfork方法
おすすめ情報