#6
by みえ » 8年前
CreateFileMapping の引数 dwMaximumSizeHigh/dwMaximumSizeLow は、マッピング可能な最大サイズで、0 にすると紐づけるファイルのそのときのサイズが最大サイズになります。shino0526y さんの回答にもありますように、CreateFileMapping はマッピング オブジェクトを作るだけで、実際のマッピングは行ないません。ファイルの内容を仮想メモリにマップするためには、マッピング オブジェクトに対して MapViewOfFile などの API を呼び出す必要があります。
MapViewOfFile が持つ dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap という引数を使ってマップする領域を指定できます。引数 dwNumberOfBytesToMap に 0 を渡すと、ファイルの末尾までの領域をメモリにマップするので、もしファイル全体をマップしたいのであれば、dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap には 0 を指定すればよく、サイズを計算する必要はありません。
わんわん さんが書きました: また、仮想メモリに読み込まれたデータは、全部一気に物理メモリにも読み込まれるんですか?
マッピング自体は、仮想メモリの各ページをディスク上の領域に紐づけるだけです。メモリへのロードは、カーネルのメモリ マネージャーがそれを必要だと判断したときに行われるはずで、一般的にはそのページへのアクセスが発生したときだと思いますが、厳密な条件は不明です。
CreateFileMapping の引数 dwMaximumSizeHigh/dwMaximumSizeLow は、マッピング可能な最大サイズで、0 にすると紐づけるファイルのそのときのサイズが最大サイズになります。shino0526y さんの回答にもありますように、CreateFileMapping はマッピング オブジェクトを作るだけで、実際のマッピングは行ないません。ファイルの内容を仮想メモリにマップするためには、マッピング オブジェクトに対して MapViewOfFile などの API を呼び出す必要があります。
MapViewOfFile が持つ dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap という引数を使ってマップする領域を指定できます。引数 dwNumberOfBytesToMap に 0 を渡すと、ファイルの末尾までの領域をメモリにマップするので、もしファイル全体をマップしたいのであれば、dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap には 0 を指定すればよく、サイズを計算する必要はありません。
[quote="わんわん" id=3,18996,144324] また、仮想メモリに読み込まれたデータは、全部一気に物理メモリにも読み込まれるんですか?[/quote]
マッピング自体は、仮想メモリの各ページをディスク上の領域に紐づけるだけです。メモリへのロードは、カーネルのメモリ マネージャーがそれを必要だと判断したときに行われるはずで、一般的にはそのページへのアクセスが発生したときだと思いますが、厳密な条件は不明です。