• ベストアンサー

【c++】共有メモリについて

【c++】共有メモリについて いつもお世話になっています。 共有メモリについて勉強していて、いろいろと調べていて気になったのですが、 「ファイルマッピング」と「メモリマップドファイル」とは 同じものなのでしょうか?全く違うものなのでしょうか? (ちなみに、これらは共有メモリを使用するための1つの方法である、という 認識で宜しいのでしょうか。) また、共有メモリのほうが、ソケット、パイプなどよりも高速アクセスできる 様ですが、どのぐらい高速なのか紹介しているサイトがありましたら 教えて頂けませんでしょうか。

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

  • ベストアンサー
  • anicicle
  • ベストアンサー率36% (129/356)
回答No.1

>「ファイルマッピング」と「メモリマップドファイル」とは同じものなのでしょうか? >全く違うものなのでしょうか? 「ファイルマッピング」は(共有メモリのことと限定すれば)、メモリ空間上に共有アクセス領域を作成することです。 「メモリマップドファイル」は上記により作成された、アクセス領域のことです。 >また、共有メモリのほうが、ソケット、パイプなどよりも高速アクセスできる様ですが、 >どのぐらい高速なのか紹介しているサイトがありましたら 環境により違いますから、厳密に比較しているサイトはないでしょう。 「ソケット」や「パイプ」と「共有メモリ」の一番大きな違いはデータのアクセス段数です。 イメージとして、 ソケットやパイプは 「プロセスA」→(ソケット)→メモリ→(ソケット)→「プロセスB」 共有メモリは 「プロセスA」→メモリ→「プロセスB」 となります。 間に別のプロセスが介在しない分、高速アクセスできる「可能性」があります。 (正確には、メモリコントローラーも解するのでもう少し複雑ですが) 尚、共有メモリはアクセスの高速化は規定できる半面、OSによっては利用を制限されたり、同時多重アクセスでのメモリ内容の正当性の保証等、対策すべき問題も多々あります。

yuki7091
質問者

お礼

ご回答有難うございます。 理解できました。 >>また、共有メモリのほうが、ソケット、パイプなどよりも高速アクセスできる様ですが、 >>どのぐらい高速なのか紹介しているサイトがありましたら >環境により違いますから、厳密に比較しているサイトはないでしょう。 厳密でなくても、構いません。 しかしながら、ソケットよりも高速な理由が分かりました。 有難うございました。

関連するQ&A

  • 共有メモリ メモリマップドファイルについての質問です。

    共有メモリ メモリマップドファイルについての質問です。 visual C++ を用いて、異なるアプリケーション間でデータを共有するプログラムを作っています。 ネットで検索してみたところその内容を説明しているホームページがいくつかあったのですが、どうしても完成にたどり着くことができません。 どのようにしたらよいのでしょうか??

  • 共有メモリへのマッピング(MapViewOfFile)について

    共有メモリについて(特にMapViewOffileについて)教えてください。 ある構造体と、あるデータAを共有メモリへマッピングしたい考えています。 構造体は、 typedef struct _Data { int length; long data; char mIntArrayData[256]; } Data; データAは、short型の配列(要素数はx*y*z,x,y,zはcsvファイル等から読み込む)で、サイズをdatasize = sizeof(short) * x * y * z;とします。 この2つを使って、 両方のデータを long AllDataSize = sizeof(Data) + datasizeとしました。 このサイズを使って、共有メモリのマップハンドルを hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,PAGE_READWRITE,AllDataSize,MAPPED_FILE_NAME); (MAPPED_FILE_NAMEは、 メモリマップドファイルの名前) で、生成しました。 生成はできたのですが、データAにアクセスするための下記のような時にマッピングに失敗してしまいました。 DWORD dwOffset = sizeof(DATA); short *pData = (short *)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, dwOffset, Bytes); (Bytesはマッピングしたいバイト数でsizeof(short)の倍数) 次のようなDATAにアクセスするマッピングには成功しています。 DWORD dwOffset = 0; DATA *pDATA = (DATA *)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, dwOffset, sizeof(DATA)); 色々なサイト等を調べて、考えてみたのですが、怪しいところはdwOffsetと、CreateFileMappingで、マッピングしたい全体のファイルサイズを、構造体とデータAのサイズの単純な足し算としているところと考えています。ただ、はっきりとした答えが全くわからないので、どうか御教授お願いします。

  • C++ と HTML で、共有メモリ・・・

    お世話になります C++とHTMLで共有メモリを使用したいと考えています C++Builderを使用するので、C++とHTMLの起動されるアプリケーションは同じとなります 無理でしょうか? 最終手段として一時ファイルを使用する手を考えています よろしくお願い致します

  • C++で開発するのですが、できるのかどうか解りません。

    Windows2000Server+C++Builderで開発します。 以下の点がわかりません。解る分だけでいいので教えてください。 また、参考となるURLなども教えていただけるとありがたいです。 1.子スレッドが終了した場合、親スレッドはそれを検知出来ますか?   ポーリングではなく、イベント通知で検知したい。 2.別EXEにWindowMwssageを送信できますか?(共有メモリなどを利用しますので必要な情報は渡せます。) 3.共有メモリの情報を取得するのと、レジストリからデータを読むのとどちらが高速ですか?(結構長いデータも扱います) 4.共有メモリはファイルマッピングを必要としますか? 以上、お願いします。

  • 1個のメモリを2個のCPUで共有する方法

    お世話になります。 1個のメモリを2個のCPUで共有する方法について、参考例教えてください。 メモリに画像を取り込み認識するのですが、処理速度向上のため、画像取り込みその他の仕事と、認識を分けてと考えています。 メモリを共有するときに気おつけ無ければならないことも御願いします。 よろしく御願いします。

  • 1個のメモリを2個のCPUで共有する方法

    お世話になります。 1個のメモリを2個のCPUで共有する方法について、参考例教えてください。 メモリに画像を取り込み認識するのですが、処理速度向上のため、画像取り込みその他の仕事と、認識を分けてと考えています。 メモリを共有するときに気おつけ無ければならないことも御願いします。 よろしく御願いします。

  • 64bit Linux上で32bitアプリケーションを使って共有メモリアクセス

    64bit Linux と共有メモリとの関係についてどなたか教えて いただけないでしょうか。  (現段階では、マシンもOSも64bitのものは無く、導入前での   検討段階です) 使いたいと思っているのは Red Hat Enterprise Linux 3.0 です。 現在動かしているアプリケーションが使っている共有メモリの サイズが大きくなってきたために64bitのLinuxを検討しています。 ただし、プログラム移行の手間を最小限にするめ、64bit環境上で 32bitライブラリにリンクしてmakeし直す程度の対応で済ませたいと 思っています(言語はCです)。 このような32bitアプリケーションが発行する共有メモリ関係の API‥たとえば、shmget()とかshmat()‥の呼び出しは、どこかの レイヤで最終的に64bit化されて動くと想像しています。 そうすると、32bit用のインターフェースに破綻を来たさない限りは、 総量で4GB超の共有メモリをアクセス可能(具体的には、総量として 4GBを越えて取得でき、参照時にはマッピングサイズが小さければ、 それらのいずれの部分もマッピングできる)と想像しているのですが そのような理解で良いでしょうか。 ちなみに、4GB超の大きなメモリを1つ使うわけではなく、100個前後 に分散した取得/マッピングをしています。つまり個々のブロックは 小さなサイズです。 よろしくお願いします。

  • VisualC++2008 APIと共有メモリ・・・

    お世話になります C++でAPIのインターフェースアドレスを共有メモリに配置して、 他のアプリケーションから使用する事は可能でしょうか? イメージとして CoCreateInstance( memA ); // memAは共有メモリに配置したい 他のexeより、memAを使用する これができるとして、ネットワークを介してでも問題ないでしょうか? まだまだ、勉強中なのですが御指導頂けたら幸いです よろしくお願いします

  • 98と2000のファイル共有

    いつもお世話になっております。 申し訳ありませんが、タイトルにも述べた通り98と2000間のファイル共有について教えてください。 98と2000をファイル共有しているのですが、2000から98のPCの中にコピーをしようとしたら、「ネットワークアクセスは拒否されました アクセス権があるか確認してください」とのメッセージが出てきて困っているのですが原因が分かりません。 2000から98を覗き98の中にあるファイルを2000側に取り出すことは出来るのですが・・・

  • パソコンメモリ交換

    パソコンメモリ交換  いつも回答ありがとうございます。  DELL OptiPlex GX260 Windows XP  を使用しています。メモリにエラーが出るので、メモリを交換したいのです。  仕様では、  DDR SDRAM PC2100 Non-ECC DIMMソケット×2 システム最大2GB  と表記されています。 ●Q01. 上記に完全一致で無くとも、作動するのではないかと思うのですが、どのような条件で、商品を探せばよいでしょうか? ●Q02. システム最大2GB を利用したい。これだと、一つのソケットに1GBを2個付けることになるのでしょうか? ●Q03. 2GBというメモリがあるのかどうか不明ですが、  2GB一個では、認識しないのでしょうか? ●Q04. PC2100と言うのは、メモリの認識スピードのようですが、もっと、高速のメモリでも互換性があるのでしょうか? ●Q05. PC2100と表記があるので、これ以上の高速のメモリがあってもこれよりも高速なメモリを採用しないで、PC2100のメモリが、最適なのでしょうか?  価格的には、中古でよくいくらぐらいのものですか?  ヤフオクなどで中古の安い良質なメモリを探したいです。  メモリを交換した経験のある方、教授方よろしくお願いします。  たとえ、一つだけでも、御知りのことがありましたら、教授方よろしくお願いします。  敬具