これには少し説明が必要になるので、ここで私に固執してください。
まず、このトピックは矛盾する用語の紛らわしい泥沼です。したがって、「仮想メモリ」がディスクと関係があるという考えをすべて捨ててください。
- 物理メモリは、物理デバイスに保存されているメモリです。これは通常、システムRAMを指しますが、ディスクバッファ、NICバッファ、グラフィックカードVRAMなどの場合もあります。
- 仮想メモリは、ユーザーモード(仮想)アドレス範囲にマップされた物理アドレス範囲のセットであり、メモリに安全かつ区画化された方法でアクセスできるようにします。
これを行う理由について簡単に説明します。プロセスに直接メモリアドレスを指定した場合、(実現可能に)単一のメモリストアしか持てませんでした。これは不便であり、パフォーマンスに悪影響を及ぼします。仮想アドレスがシステムメモリ(RAM)の範囲外の物理アドレスに変換されると、プロセッサはページフォールトを発行します。これは、OSの割り込みハンドラーに信号を送り、OSの割り込みハンドラーはメモリアクセス操作を別のデバイスに委任できます。使える!
32ビットWindowsシステムでは、プロセスが任意の時点でアドレス指定できる仮想メモリの最大量は2GBです。これは、AWEを使用して3GBに、またはAWEを使用して4GBに増やすことができます/4GT
。これは、プロセスが2GB(または前述の設定によっては3GB / 4GB)のメモリしか割り当てることができないという意味ではありません。それ以上に同時にアクセスできないことを意味します。
たとえば、サイズが1GBのメモリマップトファイルを開くと、仮想メモリの使用量が1GB増加します。RAMにもディスクにも触れていませんが、プロセスに仮想アドレス空間のブロックを割り当てています。このメモリマップトファイルを使用可能にすると同時に1.1GBのRAMを割り当てたい場合は、できません。まず、プロセスからファイルのマップを解除する必要があります。メモリは割り当てられたままでデータでいっぱいになる可能性がありますが、実際にはプロセスにマップされないことに注意してください。マシンに8GBのRAMがある場合は、6GBのRAMをデータで埋めて、2GBをプロセスにマップできます。そのメモリの別のセクションを使用する必要がある場合は、既存のブロックのマップを解除し、他のセクションをマップする必要があります。
だから、あなたが見ている違いに:
プライベートバイトは、他のプロセス(マップされたファイル、グローバルヒープなど)と共有されている仮想メモリを除いて、プロセスがマップした仮想デバイスメモリのバイト数を示します。
ワーキングセットは、アクティブに使用している物理メモリのバイト数を示します。これには、物理メモリ、デバイスバッファ、およびマップされたファイルが含まれます。これは、タッチされた物理メモリ+マップされた仮想非システムメモリに相当するため、かなり奇妙な数字です。一般に、この数字は完全に無視する必要があります。メモリリークのデバッグには実質的に役に立ちません。
仮想バイトは、マップした仮想メモリの合計量です。
違いは、共有仮想メモリ(DLLファイルの束やグローバルヒープのブロックなど)をプロセスにマップしたことです。この違いは、これらの共有マッピングの合計サイズが約1GBであることを示しています。
これは、高速システムリソース(RAM)の可用性を高めるためにシステムメモリページをディスク(いわゆる「ページファイル」)に転送するスワッピングとは何の関係もないことに注意してください。そのファイルの名前は、Windowsのこの領域で混乱を招きませんでした。マイクロソフトが最終的に、「仮想メモリ」や「ページファイル」ではなく「スワップ」と呼ぶことにしたとき、私は大喜びします。