6

私はコンピューターの専門家ではないので、この質問をもう少し具体的に説明してみましょう。

私はいくつかの科学計算を行っていますが、その計算では結果を保存するために大量のメモリが必要になることがあります。数日前、出力ファイルに 4 GB のハード ディスクが必要でしたが、この量の RAM がありました。そう:

  • 実行中のプログラムがコンピューターで使用可能なメモリよりも多くのメモリを割り当てた場合、CLR (またはそれは別のものですか?) はメモリをどのように処理しますか? HDにスワップが作成されますか?(それが私のプログラムを遅くする可能性があることは知っていますが、私はメモリの問題にのみ関心があります)
  • Linux で MONO を使用するか、Windows で VS を使用するかなど、OS に依存しますか?

前もって感謝します!

4

3 に答える 3

12

それについて考えるのに役立つ方法は、次のとおりです。メモリはディスクスペースです。RAMは高速キャッシュです。「RAMが不足すると、システムはそれをディスクにスワップする」と考えるのではなく、「利用可能なRAMがあれば、システムはディスク上のメモリをそこに移動する」と考えています。

それはほとんどの人が考える方法とは逆ですが、私はそれが役立つと思います. RAM は単なるパフォーマンスの最適化です。割り当てることができるメモリ量の実際の制限は、使用可能なディスク領域です。

もちろん、それはそれよりも複雑です。32 ビット オペレーティング システムでは、すべてのプロセスが 20 億バイトのユーザー アドレス空間を取得します。(カーネルのアドレス空間についても同じですが、無視しましょう。) アクセスできるメモリのすべてのページは、RAM にあるかディスクにあるかに関係なく、そのアドレス空間にある必要があります。20 億バイト以上を割り当てても問題ありません。ただし、一度にアドレス指定できるのは 2 GB までです。10 GB を割り当てた場合、少なくとも 8 GB はアドレス空間にマップされません。その場合、何か他のもののマップを解除してから、必要なものをアドレス空間にマップして、それを取得する必要があります

さらに、多くのものが連続したアドレス空間にある必要があります。たとえば、1MB のスタックがある場合、アドレス空間で使用できる 連続する 100 万バイトが必要です。

「メモリが不足している」場合、RAM が不足しているわけではありません。RAM は、ディスク上の単なる高速キャッシュです。また、ディスク容量が不足しているわけではありません。それはたくさんあります。ほとんどの場合、要求を満たすには連続したアドレス空間が不足している状況にあります。

CLR メモリ マネージャーは、これらの派手なマップおよびマップ解除戦略を実装していません。基本的に、2GB のアドレス空間を取得するだけです。メモリ マップされたファイルなど、凝ったことをしたい場合は、自分でメモリを管理するコードを書く必要があります。

于 2011-05-14T14:15:09.560 に答える
3

物理的に存在するよりも多くのメモリを割り当てると、はい、スワップ領域が使用されます。

アドレス可能なよりも多くのメモリを割り当てた場合、OutOfMemoryExceptionが発生します。

Monoについてはよくわかりませんが、これはランタイムに依存し、ほぼ同じように動作すると思います(物理メモリが不足するとスワッピングが発生し、割り当てが多すぎると例外が発生します).

于 2011-05-14T13:31:53.077 に答える
3

ランタイムは、オペレーティング システムにメモリの追加を要求するだけです。オペレーティング システムは、メモリの既存の内容をディスクにページングしたり、必要に応じて空き物理メモリを増やすためにスワップしたりします。通常のアンマネージ プログラムと同様に、マネージ C#/.NET プログラムでも同じことが起こります。

マネージ アプリケーションの世界での唯一の違いは、.NET ランタイムによってメモリ オーバーヘッドが発生するため、アプリケーションで実際に使用できるメモリの総量が制限されることです。たとえば、ガベージ コレクターは、その作業を行うためにある程度のメモリ領域を必要とします。

はい、少なくともある程度は OS に依存します。ただし、最新のオペレーティング システムのほとんどは、メモリ管理に対してかなり類似したアプローチを採用しています。

于 2011-05-14T13:32:17.100 に答える