• ベストアンサー
  • 困ってます

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

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

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数1118
  • ありがとう数5

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

  • ベストアンサー
  • 回答No.1

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連する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のサイズの単純な足し算としているところと考えています。ただ、はっきりとした答えが全くわからないので、どうか御教授お願いします。

  • 【至急】メモリマップドファイルを利用したメモリの共有

    課題で次のような問題が出ました。いくら調べてもぜんぜん見つかりません。 Windowsのメモリマップドファイルを利用したメモリの共有で,幾つかのプロセスが1つのメモリマップドファイルを共有することで起こりそうな問題と,その問題の解決に必要な事柄を述べる。

  • メモリマップドファイルを使って高速化できるか

    現在、テキストファイルの読込みを関数(fopen(),fgets(),fclose()) を使って処理しています。 今回、処理を高速するためメモリマップドファイルの使用を検討しています。 そこで質問なのですが、 メモリマップドファイルを使うと劇的な高速化が期待できるのですか? 高速化する場合、どういったタイプのファイルに有効なのですか? 自分で調べろと言われそうですが、ご勘弁ください。 使ったことのある方、また、実際に比較してみたことのある方が いましたら教えて下さい。

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

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

  • 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個前後 に分散した取得/マッピングをしています。つまり個々のブロックは 小さなサイズです。 よろしくお願いします。

  • C++かCの再選択 

    いつもお世話になっています。 c++の初心者ですが、煮詰まったので質問させてもらいます。 私はC++の入門書を理解し2~3個のコンソールプログラムを作った位のレベルです。煮詰まったのは、このままC++を勉強するかそれともCを勉強した方がいいのか迷っています。Cは知らないのでC++入門書を勉強した時、Cを勉強しているのと一緒なのですか(軽くSTL、オブジェクト志向の考え方を追加した感じ) Cのほうが文法、メモリの動きなどサンプルプログラム を作るにもクラスをつくる手間が省け簡単に書けますし 早く習得できると思うのですが。気になったのは ここの書き込みで、Cの拡張がC++とCとはC++ は異言語の意見があり、私にはわかりません。 ただ「C++がわかっていてCを知らない人はいない」との意見に納得した事もあり私の選択は間違っていた のかなと思ったのです。できればC->C++経験者と いきなりC++経験者のアドバイスが聞きたいのです。

  • C++の書籍について

    今回C++を勉強するために、書籍を探しております。 書籍は沢山あるのですが、どうもピッタリという本が見つかりませんので、もしご存知でしたら教えていただけたらと思います。 で、私がどんな本を探しているかというと、 ■Windowsアプリケーションの作成が目的 ■C++の基礎が勉強できる(表示からポインタ・ファイル操作など) ■C++のGUIプログラムの作成に関する勉強ができる この条件なのですが、ちょっと私自身こだわりといいますか・・・ 作成をVC++ではなくテキストエディタで作成していきたいと考えております。 私が知っている言語で例えるなら、HTMLをホームページビルダー等を使わずテキストエディタで作成するような感じです。 インターネットをみると簡単なウィンドウを表示するプログラムの作成方法を紹介されているサイトも見かけるのですが、書籍で探すとそういったものが紹介されているものが中々ありません(地元の書店が小さいだけかもしれませんが) Windowsアプリケーションの作成にVC++は切っても切り離せないようなものなのか、あるいは、テキストエディタでは非効率的なので紹介されていないのか、それとも、入門系の本では書ききれないので、別冊や別のジャンルで紹介されているのかと、そんな気もしてしまうのですが、 もし心当たりがある、または、そんな本は無いだろう!ということがございましたら、教えていただけるとありがたいです。

  • C++のゲームサイトで勉強したいです。

    お世話になります。 今もC++のゲームサイトで勉強させてもらっています。 その他にもおススメのサイトを知りたいです。 コードの書き方とか考え方とかがみなさんちがうので その違う部分に興味があるのでいろいろ参考にして 勉強しながら作りたいです。 Visual C++ 2008を使っています。 よろしくお願いします。

  • メモリマップドファイルは動作原理的に…

    QueryPerformanceCounterを使ってそれほど複雑でない関数でのベンチマークを行ったところ 今のところ全ての場合においてメモリマップドファイルのほうが単純なファイルの読み書きより高速でした。 (こんないい機能があったなんて…(笑)) それほど差がない場合もありましたが、場合によっては100倍以上もの差になった時もあります。(実メモリと比較したら全然ではありますが) メモリに困ることは最近それほどなかったので、、仮想メモリのスワップアウトが起きるとどれくらいの速度で動作することになるのか 全く実感できなかったのですが 1.このメモリマップドファイルは 原理的に、それを明示的に行うようなものとみなして問題ないでしょうか? 2.書き込み可能な属性で作り CreateFileMappingに指定するサイズがファイルサイズより大きかった場合はファイルが拡張され、それ以下だった場合はそのままのようです。 しかし、実際にそれ未満の数値を指定して、その指定したサイズ以上のアドレスのところへ書き込もうとすると、メモリの場合サクッと不正終了してくれるので逆におかしいところがあることが分かるので安心できるともいえるのですが、こちらはファイルサイズに余裕があれば、指定したサイズを超えた部分へもどうやら書き換えることができてしまうようです。 この場合、もしファイルサイズすら超えた数値へ間違って書き込み命令を出してしまった場合、切り捨てられるのでしょうか?それともどこか別のところが書き換えられてしまう危険があるのでしょうか? 3.また、試したら出来てしまったのですが 別のポインタを使って操作するのは「通常の動作」でしょうか? それとも未定義の動作でしょうか? 例) ・ ・ ・ char *a = (char*)MapViewOfFile( hMap, FILE_MAP_WRITE , 0, 0, 0); wsprintf(a,"aaaaaa"); char *b= a+3; wsprintf(b,"bbbbbb"); b+=3; wsprintf(b,"ccc"); UnmapViewOfFile( a ); ・ ・ ・ 結果: aaabbbccc