Windows APIの MapViewOfFile について教えてください。


MapViewOfFile によって割り当てることの出来るビューのサイズは実メモリの搭載量によって影響されるものなのでしょうか?

MapViewOfFileによる割り当てはプロセスの仮想メモリ空間への割り当てのため、実メモリ搭載量には関係ないように思えるのですが、実際には影響を受けているように思えます。

はたして実メモリ搭載量は MapViewOfFile で割り当てられるビューのサイズの最大量に影響を及ぼすのかどうか、また及ぼすのであれば、その仕組みを教えていただけないでしょうか?

(実メモリが十分にないところで大きなビューを割り当ててもパフォーマンス上、問題があるということは理解しておりますので、あくまでも仕組み上はどうなのかというところを教えていただければありがたいです)

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2007/01/22 01:30:10
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kurukuru-neko No.2

回答回数1844ベストアンサー獲得回数155

ポイント70pt

>2GBの仮想アドレス領域内に連続した空き領域があれば

>ビューの割り当てはできるように思えるのですが、

すべてのプログラムの合計なので現実は2Gは不可能です。

実験では1.5G程度でした。

http://itpro.nikkeibp.co.jp/article/Windows/20051111/224393/?ST=...

以下のページ化プール領域の最大が470M,非ページ化プール領域

256Mの制限があります。両方ともすべてのアプリ・OSで

共用されています。 いずれも通常自動でサイズが計算され

利用されています。

最悪1Gのファイルマッピングを行う場合最悪100Mのページ

化プール領域が必要ですが。 そのサイズの空は通常

システム搭載のRAMに比例して自動決定されます。

(PagedPoolSize,NonPagedPoolSize)

通常実メモリーから自動計算されるので結果実メモリー

に依存することになります。

以下にありますが、OSの改善によりできるサイズが拡大

されてはいますが。 すべてのWindowsではありません。

http://msdn.microsoft.com/msdnmag/issues/01/12/XPKernel/

プールに空きがプログラム動作時に空きあれば動作するし

なければ動作しません。

id:you1982

度々のご回答、どうもありがとうございます。

大ざっぱに言えば、実メモリのサイズがページ化プール領域と非ページ化プール領域のサイズに影響を及ぼし、そしてプール領域のサイズがマッピングできるファイルのサイズ(あるいはビューのサイズ、またはその両方)に影響を及ぼす、という仕組みですね。

細かい数値の計算方法についてはよく理解できていない部分もありますが、仕組みについてはよく分かりました。どうもありがとうございました。

2007/01/22 01:28:12

その他の回答1件)

id:kurukuru-neko No.1

回答回数1844ベストアンサー獲得回数155

ポイント1pt

>実メモリ搭載量は MapViewOfFile

http://support.microsoft.com/kb/830783/ja

>割り当てることの出来るビューのサイズ

割り当てが出来るビューのサイズは、実メモリー及び

連続してメモリー上に割り当て可能なアドレス空間が

あるかどうかが問題になる。

一般的な32bitのWindowsでは仮想アドレスの

総合計が通常2Gに制限されている。

http://support.microsoft.com/kb/818894/ja

http://support.microsoft.com/default.aspx?scid=kb;ja;888732

id:you1982

ありがとうございます。ただ、申し訳ありませんが、ちょっと分かりにくいです。

3番目のURLにあるように32bitプロセスでの仮想アドレス領域は2GBあるわけで、MapViewOfFileを呼び出したプロセスの2GBの仮想アドレス領域内に連続した空き領域があればビューの割り当てはできるように思えるのですが、いかがでしょうか?

「割り当てが出来るビューのサイズは、実メモリー及び連続してメモリー上に割り当て可能なアドレス空間があるかどうかが問題になる」とご回答いただいた中の、「実メモリー」がビューのサイズに影響を及ぼすという点について、ソースあるいはその仕組みをご存じでしたら教えていただけないでしょうか?

2007/01/21 21:41:09
id:kurukuru-neko No.2

回答回数1844ベストアンサー獲得回数155ここでベストアンサー

ポイント70pt

>2GBの仮想アドレス領域内に連続した空き領域があれば

>ビューの割り当てはできるように思えるのですが、

すべてのプログラムの合計なので現実は2Gは不可能です。

実験では1.5G程度でした。

http://itpro.nikkeibp.co.jp/article/Windows/20051111/224393/?ST=...

以下のページ化プール領域の最大が470M,非ページ化プール領域

256Mの制限があります。両方ともすべてのアプリ・OSで

共用されています。 いずれも通常自動でサイズが計算され

利用されています。

最悪1Gのファイルマッピングを行う場合最悪100Mのページ

化プール領域が必要ですが。 そのサイズの空は通常

システム搭載のRAMに比例して自動決定されます。

(PagedPoolSize,NonPagedPoolSize)

通常実メモリーから自動計算されるので結果実メモリー

に依存することになります。

以下にありますが、OSの改善によりできるサイズが拡大

されてはいますが。 すべてのWindowsではありません。

http://msdn.microsoft.com/msdnmag/issues/01/12/XPKernel/

プールに空きがプログラム動作時に空きあれば動作するし

なければ動作しません。

id:you1982

度々のご回答、どうもありがとうございます。

大ざっぱに言えば、実メモリのサイズがページ化プール領域と非ページ化プール領域のサイズに影響を及ぼし、そしてプール領域のサイズがマッピングできるファイルのサイズ(あるいはビューのサイズ、またはその両方)に影響を及ぼす、という仕組みですね。

細かい数値の計算方法についてはよく理解できていない部分もありますが、仕組みについてはよく分かりました。どうもありがとうございました。

2007/01/22 01:28:12
  • id:kurukuru-neko
    補足
    Larger Mapped Filesの解説部分
    http://msdn.microsoft.com/msdnmag/issues/01/12/XPKernel/
  • id:you1982
    〆切後にも補足をいただき、どうもありがとうございました。
  • id:you1982
    もう一点、本件に関して分かったことがあったので自己補足します。

    kurukuru-nekoさんに教えていただいた仕組みで実メモリがMapViewOfFileの最大サイズに影響を及ぼす仕組みは分かったのですが、実験をしたところ、数字的な部分ではやや納得のいかない部分がありました。

    つまり、実メモリの搭載量を考えると作成できても良いはずのビューが実際には作成できないということがありました。

    しかし、これは Windows Update で解決をしました。Windows を最新のものにすることで、従来よりも大きな(作成できても良いはずの)ビューがちゃんと作成できるようになったということです。

    一応、後で似たような疑問を持たれた人のために追記しておきます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません