2

ここから、Windows 32 ビット仮想メモリ ページ マッピングについて学んでいます。

(Vista、Win 7、Server 2003/2008 32 ビット バージョンなど、最新の Windows バージョンをターゲットにしています。)

http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

二つの混乱、

  1. ユーザー空間の仮想メモリ空​​間は通常 2G に制限されていますが、物理ディスクのページ ストレージは 2G よりもはるかに大きくなる可能性があります。仮想メモリ ページより多くのディスク ページがあるため、理論的には複数のディスク ページを 1 つの仮想アドレス ページにマップできます。ユーザーが何らかの仮想アドレスへのアクセスを要求した場合、複数のディスク ページが 1 つの仮想アドレス ページにマップされている場合、メモリ マネージャーはどのディスク ページにアクセスする必要があるかをどのように認識しましたか?

  2. byte[] 配列が連続した仮想メモリ空​​間を使用しなければならないなどの制限がある理由がわかりません。理論的には、500M の仮想空間アドレスしか割り当てない場合でも、そのような仮想空間アドレスを再利用して、ディスク ページ ファイルをマップ/アンマップし続け、2G よりも大きく消費することができると思います。

何か案は?

4

4 に答える 4

2

バイト (またはその他の) 配列は、連続したアドレス空間(この場合は連続した仮想アドレス空間) を使用する必要があります。これは断片化が問題になる可能性がある領域であり、実際にはメモリの仮想化によって悪化します。このようなシステムシステムに固有のさまざまな「リダイレクト」と、それを効率的にするためのパフォーマンスの考慮事項により、仮想アドレス空間にマッピングされた物理アドレス空間の実際の割り当てがチャンク (通常はページ) で行われます。

そのため、仮想アドレス空間の 10 バイトのチャンクを要求すると、実際には 4K ページ全体が予約およびマップされる可能性があります。ページ内の物理メモリは連続している必要があるため、4K の仮想アドレス空間全体が「ブロック」される可能性があります。
複数の小さな割り当てを 1 つのページ内に配置できます (優れたメモリ マネージャーはこれを達成しようとします) が、実際には厳密に必要とされる以上のアドレス空間が予約されています。開始 fa ページで 1 バイトを割り当て、次に 4K - 2 バイトの後に別の 1 バイトを割り当てることを検討してください。これは(効率的に)ページ全体を占めます。
中央の割り当てが不要になり、解放されるかどうかを検討してください。「トップ」と「テール」の値が解放されるか、別の場所に移動されるまで、仮想アドレス空間にギャップが作成され、4K-1 バイト未満のサイズでしか埋めることができません。これらの種類のことが十分に発生すると、仮想アドレス空間の連続した領域は、実際に実際に使用されたメモリの合計よりもはるかに速く縮小します。

あなたの (32 ビット ランドでは制限されている) アドレス空間を、CPU/OS がサポートするより大きなディスクまたはメモリ空間にマッピングすることを妨げるものは何もないという点で、あなたは正しいです。一部のチップは、 PAEなどのメカニズムを介して 4GB を超える物理アドレス空間でこれを可能にします。

Windows自体は、「アドレス空間のマッピングを変更して、より広いプールに別の「ウィンドウ」を取得する(PAE、WoW64の実行、ディスク、または混合などを介して)」のほとんどの側面に対処するためのAPIを提供します。これはAWEと呼ばれます。しかし、このようなメカニズムは何年も前から存在していました (従来のメモリを使用した EMS の時代、または実際にセグメント化されたメモリの時代を覚えている人たちのように.

CPU と OS のサポートがなくても、さまざまなテクニックを使って手作業で行うことができます (以下を参照)。

ウィンドウにおけるこれのより複雑な側面の多くは、非常に興味深い Raymond Chen によって扱われました。

于 2009-08-19T10:20:38.753 に答える
0

プロセスで使用できる仮想アドレス空間の合計は 4GB です。この上位 2GB はすべてのプロセスに共通であり、システム レベルのコンポーネントのみがアクセスできます。下位 2GB は各プロセス専用であり、共有されません。これは、RAM のサイズとはまったく関係ありません。ユーザー プロセスにマップされた 2GB をはるかに超えるディスク ページが存在する可能性があります。2GB のプロセス空間はプライベートであるため、すべてのプロセスの合計アドレス空間は 2GB をはるかに超えます。理論上でも、同じプロセスで複数のディスク ページを 1 つの仮想アドレスにマップすることは不可能です。

于 2010-01-12T22:26:34.367 に答える