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