メモリマッピングについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
わんわん

メモリマッピングについて

#1

投稿記事 by わんわん » 8年前

windowsのメモリマッピングについて教えてもらいたいです。
MapViewOfFile APIでビューを作成する際に、ビューのサイズを0に設定した場合は読み書きしたいファイルと同じバイト数が仮想メモリに読み込まれるのでしょうか?
また、仮想メモリに読み込まれたデータは、全部一気に物理メモリにも読み込まれるんですか?

アバター
durandal
記事: 11
登録日時: 8年前
住所: 長野県

Re: メモリマッピングについて

#2

投稿記事 by durandal » 8年前

MapViewOfFile APIでビューを作成する際に、ビューのサイズを0に設定した場合は読み書きしたいファイルと同じバイト数が仮想メモリに読み込まれるのでしょうか?
MSDN によるとマッピングオブジェクトのサイズを決定するのは MapViewOfFile関数ではなく CreateFileMapping関数です。

CreateFileMapping関数 の第4引数と第5引数の両方に0を指定することで、読み込むファイルのサイズがマッピングオブジェクトの最大サイズとなるようです。

以下を参照してください
[anchor=a1 goto=https://msdn.microsoft.com/ja-jp/library/cc430039.aspx]CreateFileMapping - MSDN[/anchor]
[anchor=a2 goto=https://msdn.microsoft.com/ja-jp/library/cc430198.aspx]MapViewOfFile - MSDN[/anchor]

アバター
durandal
記事: 11
登録日時: 8年前
住所: 長野県

Re: メモリマッピングについて

#3

投稿記事 by durandal » 8年前

リンク張り間違えました (^^;)
sorry

MapViewOfFile関数 - MSDN
CreateFileMapping関数 - MSDN

わんわん

Re: メモリマッピングについて

#4

投稿記事 by わんわん » 8年前

返信ありがとうございますm(_ _)m。マッピングオブジェクトの大きさの指定の仕方はわかりました。
リンク先のMSDNを見たところMapViewOfFile関数を呼び出すのは、ファイルを読み書き可能の状態にするために仮想メモリにマッピングオブジェクトのデータを対応づけると解釈しました。
ということはファイルの一部を読み書きするには、MapViewOfFile関数の第4引数、第5引数を計算してマッピングオブジェクトの一部をメモリにマップしないといけないのでしょうか?
長文失礼しました。

yama

Re: メモリマッピングについて

#5

投稿記事 by yama » 8年前

あんどーなつ
Math
の次は
shino0526y
ですか?

嫌われているからってコロコロ名前を
変えないで頂きたいのですが。

みえ
記事: 23
登録日時: 8年前

Re: メモリマッピングについて

#6

投稿記事 by みえ » 8年前

CreateFileMapping の引数 dwMaximumSizeHigh/dwMaximumSizeLow は、マッピング可能な最大サイズで、0 にすると紐づけるファイルのそのときのサイズが最大サイズになります。shino0526y さんの回答にもありますように、CreateFileMapping はマッピング オブジェクトを作るだけで、実際のマッピングは行ないません。ファイルの内容を仮想メモリにマップするためには、マッピング オブジェクトに対して MapViewOfFile などの API を呼び出す必要があります。

MapViewOfFile が持つ dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap という引数を使ってマップする領域を指定できます。引数 dwNumberOfBytesToMap に 0 を渡すと、ファイルの末尾までの領域をメモリにマップするので、もしファイル全体をマップしたいのであれば、dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap には 0 を指定すればよく、サイズを計算する必要はありません。
わんわん さんが書きました: また、仮想メモリに読み込まれたデータは、全部一気に物理メモリにも読み込まれるんですか?
マッピング自体は、仮想メモリの各ページをディスク上の領域に紐づけるだけです。メモリへのロードは、カーネルのメモリ マネージャーがそれを必要だと判断したときに行われるはずで、一般的にはそのページへのアクセスが発生したときだと思いますが、厳密な条件は不明です。

わんわん

Re: メモリマッピングについて

#7

投稿記事 by わんわん » 8年前

返信ありがとうございます!

ちょうどわからなかったところを詳しく書いていただいたので、数日悩んでいたことがちょっとスッキリしました。
また機会があればよろしくお願いします。

返信

“C言語何でも質問掲示板” へ戻る