2017-07-30 18 views
1

私の教授は、定期的に、他の2 GBがOSによって使用されるため、4 GBのRAMのうち約2 GBしか使用できないと言いました。しかし、いくつかのテストを実行すると、プロセスの4 GBの仮想メモリスペースでは、VirtualAlloc()機能を使用して最大2 GBまでしか割り当てることができません。それはなぜですか(私はそれが約3 GB以上になると予想していました)?4 GBの仮想メモリ空​​間に2 GBしか割り当てられないのはなぜですか?

私が知っているように、スタック、データ、およびコードセグメントはわずかなメモリしか使用しません。私の友人の一人は、教授が言ったように、他の2 GBがOSによって使用されていると私に言った。しかし、私は教授が2GBのphysical memoryを意味したと思う。このプロセスのvirtual memoryにはありません。 誰もここで何が起こるか説明できますか?ありがとう。

いくつかの情報:

物理メモリ:4ギガバイト

仮想メモリ:4GB。

OS:Windowsの10

+0

Windows起動時の読み方を変更して約3GBにすることができます。https://blogs.technet.microsoft.com/askperf/2007/03/23/memory-management-demystifying-3gb/ –

+0

使用していますか64ビットOS&コンパイラ? –

+0

@ M.M 64ビットOSを使用し、32ビットでコンパイルします。 – Rickie

答えて

4

あなたの教授は正しいです - あなたの仮想 2 GBのメモリは、カーネルメモリです。 このようにして、コンテキストスイッチが発生すると、これらの2 GBは残り、もう一方の2つだけを交換する必要があります。パフォーマンスに役立ちます。

また、hereをMicrosoftから説明し、ユーザー部分を3GBに増やす方法も説明しています。

ちなみに、仮想メモリがはるかに大きい64ビットマシンでは状況が異なります。

3

RAMとは関係ありません。VirtualAlloc()の仮想には嘘はありません。もちろん、上位2GBはOSに予約されています。ファイルシステムのキャッシュとビデオメモリのアパーチャが必要です。後者は/ 3GBブートオプションが動作しなくなった大きな理由です。あなたが知ったように、完全な2GBを得ることはできません、あなたのプログラムはアドレス空間も必要とし、常に最初です。これは、OSローダーによってロードされたときに得られたもので、残っているものはVirtualAllocによって分割することができます。

通常、2 GB未満であると、ロードされたDLLによってアドレス空間が断片化する傾向があります。インポートライブラリをリンクしていなくても、アンチマルウェアとクラウドストレージユーティリティがそれらをインジェクトするかもしれないとしても、あなたがいくつかを使うかもしれないことに注意してください。また、プログラム内のヒープ割り当ては、分割を引き起こす傾向があります。

これらの懸案事項はかなり古くなっており、現代のマシンはすべて64ビットOSをブートします。 32ビットプログラムがエミュレータで実行され、OSによって上位範囲が不要になりました。 /LARGEADDRESSAWARE linker optionとリンクすることで、4GBに近づくことができます。そのオプションは、それ自体が、最初に、そのようなアドレス空間を分割することが良いアイデアと考えられていた理由を、かなり良いヒントにしています。また、64ビットOSでのアプローチ。

関連する問題