ページ 1 / 1
メモリマッピングについて
Posted: 2017年3月29日(水) 17:36
by わんわん
windowsのメモリマッピングについて教えてもらいたいです。
MapViewOfFile APIでビューを作成する際に、ビューのサイズを0に設定した場合は読み書きしたいファイルと同じバイト数が仮想メモリに読み込まれるのでしょうか?
また、仮想メモリに読み込まれたデータは、全部一気に物理メモリにも読み込まれるんですか?
Re: メモリマッピングについて
Posted: 2017年3月29日(水) 20:18
by durandal
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]
Re: メモリマッピングについて
Posted: 2017年3月29日(水) 20:22
by durandal
Re: メモリマッピングについて
Posted: 2017年3月29日(水) 23:36
by わんわん
返信ありがとうございますm(_ _)m。マッピングオブジェクトの大きさの指定の仕方はわかりました。
リンク先のMSDNを見たところMapViewOfFile関数を呼び出すのは、ファイルを読み書き可能の状態にするために仮想メモリにマッピングオブジェクトのデータを対応づけると解釈しました。
ということはファイルの一部を読み書きするには、MapViewOfFile関数の第4引数、第5引数を計算してマッピングオブジェクトの一部をメモリにマップしないといけないのでしょうか?
長文失礼しました。
Re: メモリマッピングについて
Posted: 2017年3月29日(水) 23:52
by yama
あんどーなつ
Math
の次は
shino0526y
ですか?
嫌われているからってコロコロ名前を
変えないで頂きたいのですが。
Re: メモリマッピングについて
Posted: 2017年3月30日(木) 02:08
by みえ
CreateFileMapping の引数 dwMaximumSizeHigh/dwMaximumSizeLow は、マッピング可能な最大サイズで、0 にすると紐づけるファイルのそのときのサイズが最大サイズになります。shino0526y さんの回答にもありますように、CreateFileMapping はマッピング オブジェクトを作るだけで、実際のマッピングは行ないません。ファイルの内容を仮想メモリにマップするためには、マッピング オブジェクトに対して MapViewOfFile などの API を呼び出す必要があります。
MapViewOfFile が持つ dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap という引数を使ってマップする領域を指定できます。引数 dwNumberOfBytesToMap に 0 を渡すと、ファイルの末尾までの領域をメモリにマップするので、もしファイル全体をマップしたいのであれば、dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap には 0 を指定すればよく、サイズを計算する必要はありません。
わんわん さんが書きました: また、仮想メモリに読み込まれたデータは、全部一気に物理メモリにも読み込まれるんですか?
マッピング自体は、仮想メモリの各ページをディスク上の領域に紐づけるだけです。メモリへのロードは、カーネルのメモリ マネージャーがそれを必要だと判断したときに行われるはずで、一般的にはそのページへのアクセスが発生したときだと思いますが、厳密な条件は不明です。
Re: メモリマッピングについて
Posted: 2017年3月30日(木) 08:59
by わんわん
返信ありがとうございます!
ちょうどわからなかったところを詳しく書いていただいたので、数日悩んでいたことがちょっとスッキリしました。
また機会があればよろしくお願いします。