質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

2541閲覧

メモリマップトファイルについて

09logic

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/10/29 01:09

こんにちは。
プロセス間の通信をメモリマップトファイルにて行おうと思っているのですが、
分からないことがありますので、ご教授お願いします。

Q.
プロセスAがHOGEファイルをオープンして、
メモリにマップします。

次にプロセスBもHOGEファイルをオープンして、
メモリにマップします。

このとき、HOGEファイルのメモリマップは、
プロセスAとプロセスBでそれぞれ違う空間に展開されるのでしょうか。

それとも、一つのプロセスがメモリマップを持っている限り、
別のプロセスがファイルをオープンしてメモリにマップしても、
見る空間は同じなのでしょうか。

まだ全然理解できていないので言葉足らずだと思いますが、
ご教授ご鞭撻のほど宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

このとき、HOGEファイルのメモリマップは、

プロセスAとプロセスBでそれぞれ違う空間に展開されるのでしょうか。

プロセスが異なれば、アドレス空間は異なりますが、おそらく聞きたいことは、
「プロセスAがHOGEファイルを更新した場合、プロセスBのメモリ空間上のHOGEのその位置のデータは更新が反映されるのか?」
だと思います。
(なので、そういう質問の書き方にした方が良いです)

OSによることはあるでしょうが、普通は反映されると考えて良いと思います。

投稿2018/10/29 16:48

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは。

プロセスAとプロセスBでそれぞれ違う空間に展開されるのでしょうか。

そもそも近代的なOS全般でプロセス同士は異なるアドレス空間を持ちます。
そして、通常はユーザメモリは異なる物理メモリが割り当てられます。(あるプロセスが他のプロセスのメモリを破壊できないようにするためです。)

共有メモリは、プロセスAとプロセスBのそれぞれのアドレス空間に同じ物理メモリを割り当てる機能です。
その際に割当てられるアドレスは、プロセスAとプロセスBで同じになるとは限りません。(といいますか、特に指定しなければ、異なるだろうと思います。)

これらの機能は MMU により司られます。

それとも、一つのプロセスがメモリマップを持っている限り、

別のプロセスがファイルをオープンしてメモリにマップしても、
見る空間は同じなのでしょうか。

上述した通り、プロセスが異なれば、アドレス空間は異なります。
同じ物理メモリをアクセスしているのか?という意味では、同じ物理メモリをアクセスします。

投稿2018/10/29 03:03

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

09logic

2018/10/29 04:24

ご回答ありがとうございます。 何とかなりそうです。
guest

0

MapViewOfFileEx

lpBaseAddress

呼び出し側プロセスのアドレス空間でマッピングを開始するメモリアドレスへのポインタを指定します。この値は、システムのメモリ割り当ての単位の倍数でなければなりません。それ以外の値を指定すると、関数は失敗します。システムのメモリ割り当ての単位を取得するには、 構造体のメンバを記述する 関数を使います。指定されたアドレスに十分なアドレス空間がないと、関数は失敗します。
NULL を指定すると、オペレーティングシステムがマッピングアドレスを選択します。この場合、MapViewOfFileEX 関数は MapViewOfFile 関数と同じ機能を果たします。

lpBaseAddressを指定し、かつ両方のプロセスにおいて指定したアドレスが空いている状態ならば
同じアドレスにマップする事は可能です。

投稿2018/10/29 01:44

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

09logic

2018/10/29 04:21

ご回答ありがとうございます。 もう少し調べてみます。
guest

0

あまり詳しくないのですが、Windowsの場合MSDNのCreateFileMappingを見ると

複製、継承、名前の指定のいずれかより、ファイルマッピングオブジェクトを共有することもできます。

とありますので、別にすることも共有することもできるようです。

投稿2018/10/29 01:25

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

09logic

2018/10/29 04:17

ご回答ありがとうございます。 もう少し調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問