2011-01-14 9 views
7

マイシステム: 物理メモリ:3GB
のWindows XPのService Pack 3(32bit版) スワップファイルサイズ:
最大メモリマップ割り当てサイズ?

目標を30GB:私は私のマシン上に割り振ることができる最大の可能なメモリ・マップ・サイズを確認するには。

2GBのメモリマップファイルを割り当てるために次のコードを実行すると、呼び出しは失敗します。

handle = CreateFileMapping(INVALID_HANDLE_VALUE、NULL、PAGE_READWRITE | SEC_COMMIT、0、INT_MAX、NULL);

メモリマップファイルを30GBのシステムスワップファイルサイズまで割り当てることができるので、私は一度に100MBのCreateFileMappingを絶えず呼び出すことで、非常に困惑しています。

マシンを再起動し、2GBのメモリマップファイルをCreateFileMappingに要求するアプリケーションを再実行した後、正常に動作し、有効なハンドルが返されます。だから、これはちょっと混乱して、窓のあるフードの下で何が起こっているのですか?

このような状況では、すべてのシステムページファイル(30GB)を使用して多数の小さなメモリマップファイルを作成できますが、2GBの割り当てを1回要求すると呼び出しは失敗します。マシンを再起動して同じアプリケーションを実行すると、呼び出しは成功します!

メモ:
1)メモリマップされたファイルがproccess仮想アドレス空間にロードされていないため、ファイルにはまだビューがありません。
2)OSは、システムページファイル30GBに小さな100MBのメモリマップファイルを割り当てることができます!

Windows XP SP3(32ビット)仮想メモリマネージャが要求された2GBのシステムページファイルを正常に確保できないため、システムメモリの断片化ページファイルがそれぞれ4kbであっても、メモリの割り当てを引き続き予約する必要があるようです)。再起動後、私はシステムメモリの断片化が少ないと仮定して、同じ呼び出しが成功し、サイズが2GBのメモリマップファイルを割り当てます。

私はいくつかの実験を行いました。マシンを1日実行した後、300Mbのメモリマップファイルを割り当てた小さなアプリケーションを開始してリリースしました。その後、サイズを1MB増やしてやり直してください。最後に、700MBで停止し、レポート(不十分なシステムリソース)を報告します。私はそれから、各アプリケーションを終了し、これが順番にエラーメッセージを停止し、最終的にサイズが3.5GBのメモリマップファイルを割り当て続けます!

ここで私の質問は何ですか? 100MBのメモリマップファイルを割り当てると、システムページファイル(コミット制限)の30GBまでが消費されるため、仮想メモリマネージャで内部的に何らかのタイプのメモリ断片化が発生する必要があります。あなたはINVALID_HANDLE_VALUEとシステムページファイルに裏打ちされた大容量のメモリマップファイルを作成するつもりなら

更新
結論は、その後、システムページファイル(スワップファイル)が必要なサイズにリサイズすることが必要であり、 大きな割り当て> 2gbの場合、フラグメント化されていない状態にする必要があります。重いIO負荷の下ではまだ失敗する可能性があります。これらすべての問題を回避するために、必要なサイズ(1tbでした)とメモリマップを使用して独自のファイルを作成することができます。

最終更新
私は、Windows 7のボックスで同じテストを実行し、私の驚きに、それは何も触れず(システム・ページ・ファイル・サイズまで)一つ一つの時間を動作します。 Windows XPでは、Windows 7よりも大量のメモリ割り当てが頻繁に失敗するというバグだと思います。

+0

唯一の結論は、2GBの4KBページファイルを保持するテーブルが大きすぎてシステムメモリが処理できないため、失敗するということです。 – Chad

+0

これは謎です。どのように多くのプロセスを実行していても、仮想メモリと物理メモリがどれほど大きくても、32ビットWindows上で〜300MBを超えるmemマップファイルを作成することはできません。 –

答えて

5

倍以内の問題は、ファイルの断片化です。物理メモリ(RAM)はここでは何もしません。仮想メモリシステムでは、「メモリ」はファイルシステムから割り当てられます。物理メモリは、メモリへのアクセスを高速化するための単なる最適化です。

書き込みアクセスでメモリマップファイルを要求する場合、システムには連続したページが空いているファイルが必要です。システムスワップファイルは断片化されることがよくあります。ディスクドライブの最適な断片化を解消するには、システムページファイルではなく、選択したファイルを使用して大きなメモリマップファイルを作成する必要があります。

実際に2GBのメモリマップファイルが必要な場合は、インストール時にドライブにファイルを作成する必要があります。これは、連続した2GBファイルを作成するという問題をインストールに移しますが、一度作成すると問題ありません。

+0

システムページファイルのデフラグを行うと、どのように表示されるのですか – Chad

+0

マッピングが正常に作成されました:22,743mb – Chad

+0

質問Tergiver。 IO負荷が高い場合やオペレーティングシステムの通常の使用状況では、私の割り当ては20GBから6GBにしかならず、場合によっては300MBにまで下がります。私の前提は、Windowsの仮想メモリマネージャーは、システムページファイルにページを置くことで、それがページを空けるのを見つける能力を壊していることです。重いI/Oプログラムを実行して30分待っても、私は再び20GBを再配分できます。どのようなアイデアが起こっている?私はウィンドウズがそれらのページをアンロードする時間がかかると思います。 – Chad

0

Windowsの開発者の地位を占めましょう。 次の手順を実行するユーザーがいるとします。

  1. メモリマッピングを作成します。
  2. アンマップは、メモリ
  3. のWindowsを使用して続行し、ファイル
  4. から
  5. 機密データをいくつかのメモリに読み込む重要なタスクのために、これらのページをアンロードする必要があります。

解像度マッピングされたメモリは、スワップする必要があります。しかし、マップされたものが入れ替わることを意味するものではありません。

3

ここで私の質問は何ですか? 100MBのメモリマップファイルを割り当てると、システムページファイル(コミット制限)の30GBまでが消費されるため、仮想メモリマネージャでは内部的に何らかのタイプのメモリ断片化が発生するはずです。

右の音。大きな連続したメモリチャンクを必要としない場合は、同じ容量のメモリを小さなチャンクで取得できるかどうかを尋ねないでください。

私のマシンに割り当てることができる最大のメモリマップサイズを見つけるには。

  • それが失敗した場合、サイズX.
  • でそれを試してみて、サイズX/2を繰り返してみてください。

これは、あなたの実行時にチャンク、そうでないかもしれない正確に可能な限り最大のチャンクを取得しますが、2

+0

私の最初のアイデアは仮想アドレス空間の断片化でした。ただし、仮想アドレスはまだありません。ビューをマップした後にのみ割り当てられます。他にどんな断片化がありますか? – Suma

+0

はい、それを行う有効な方法ですが、なぜシステムページファイルに予約されて呼び出しが失敗する原因になるのか、より興味がありますか?それはシステムメモリの断片化によるものです。私が来ることができる唯一の結論は、2GBの4KBページファイルを保持するテーブルが大きすぎてシステムメモリが処理できないためです。 – Chad