5

私のタスクマネージャ(トップ、ps、taskmgr.exe、またはFinder)が、プロセスがXXX KBのメモリを使用していると言ったとき、更新されますか?オペレーティングシステムは、私のアプリが使用しているメモリの量をどのように知っていますか? (そして、なぜガベージコレクションをしないのですか?)

メモリ割り当ての観点から、C++で書かれたアプリケーションは、仮想マシン(.NETやJavaなどのマネージドコード)として動作するアプリケーションからオペレーティングシステムと「見た目が異なりますか?

最後に、メモリが非常に透過的である場合、オペレーティングシステムによってガベージコレクションがなぜ機能するのかサービスによって提供されないのか私が求めて本当に興味を持っていたもの


結局のところは、オペレーティングシステムがガベージコレクションやデフラグメモリ空間を行うことができなかった理由です - 私は「単に」のプロセスにアドレス空間を割り当てる上記のステップとして見ています。

これらの回答は非常に役立ちます。ありがとう!

+0

これまでの回答は素晴らしいです。それは、「管理された」環境を提供し、ガベージコレクションを備えたオペレーティングシステムが存在するのかどうかということです。 :) –

+0

ブラックベリーのような "Java"ベースのプラットフォームと、他の組み込みシステムがあります。しかし、明示的なアプリケーション協力なしに汎用GCを提供するデスクトップクラスのOSはありません。 –

+0

管理対象OSのマイクロソフトのリサーチプロジェクトについて読んでいます。ガベージコレクションを提供していると思いますが、リファレンスが見つかるかどうかはわかります... – Martin

答えて

4

これは私がここで一つの答えで十分に答えることはできない大きな話題です。 Windows Internalsのコピーを入手することをお勧めします。これは貴重なリソースです。 Eric Lippertには最近のブログ記事があり、それはOSによって割り当てられたメモリをどのように表示できるかをよく説明しています。

プロセスが使用しているメモリは、基本的には、物理​​メモリ、ページファイル、またはファイルによってバックアップされているオペレーティングシステムによって予約されているちょうどaddress spaceです。これは、管理対象アプリケーションかネイティブアプリケーションかにかかわらず同じです。プロセスが終了すると、オペレーティングシステムは割り当てられたメモリを削除します。仮想アドレス空間は単に削除され、ページファイルまたは物理メモリのバッキングは他のプロセスが使用するために空き領域です。これはOSが実際に維持しているすべてのもので、アドレス空間と物理リソースのマッピングです。プロセスは、より多くのメモリを要求するかアイドル状態になるとマッピングがシフトする可能性があります。物理メモリの内容は、OSによって要求に応じてディスクに、またその逆にシフトできます。

これらのツールで使用しているプロセスは、割り当てられた合計アドレススペース、割り当てられた合計メモリ(ページファイル+物理メモリ)、プロセスが実際に使用しているメモリメモリ。タスクマネージャには、これらの可能性のそれぞれに別の列があります。

OSはガベージコレクションを実行できません。メモリには実際に格納されているものに関する洞察がないため、メモリの割り当てられたページだけが表示され、参照されないオブジェクトや参照されないオブジェクトは見えません。

OSハンドルは仮想アドレスレベルで割り当てられますが、プロセス自体には、ページサイズの大きなチャンクを使用し、アプリケーションが使用するのに便利なものに分割する他のメモリマネージャがあります。 Windowsは64k境界で割り当てられたメモリを返しますが、ヒープマネージャはnewを介してプログラムによって行われた個々の割り当てによって使用するためにそれを小さなチャンクに分割します。 .NETアプリケーションでは、CLRはガベージコレクションヒープから新しいオブジェクトを引き渡し、そのヒープが限界に達するとガベージコレクションを実行します。

+0

いいリンクがあります!どのように作業がOSとメモリ管理者に分かれているのかを説明してくれてありがとう。私は実際に大学でOSコースを取ったことはありませんでしたが、私はmallocを覚えていて、FFTルーチンを要求するための「正しい」サイズを見つけました。 –

2

C++と仮想マシンなどでメモリがどのように表示されるかについての質問はできませんが、アプリケーションには通常、初期化時に使用する特定のメモリ範囲が指定されているといえます。次に、アプリケーションがそれ以上のものを必要とする場合は、オペレーティングシステムから要求し、オペレーティングシステムはそれを(一般的に)許可します。これには多くの実装があります - 一部のオペレーティングシステムでは、他のアプリケーションのメモリが移動してより大きな連続ブロックになり、他のアプリケーションではさまざまなメモリが使用されます。いくつかの仮想メモリ処理が含まれることさえあります。そのすべては、抽象化された実装までです。いずれにしても、メモリはあなたのプログラム内から連続したものとして扱われます。オペレーティングシステムはそれを少なくとも処理します。

ガベージコレクションに関して、オペレーティングシステムはメモリの境界の境界を認識しますが、内側にはありません。さらに、アプリケーションで使用されているメモリを調べても、スコープ外の変数やGCが探しているブロックがどのブロックを使用しているのかはわかりません。

2

主な違いは、アプリケーション管理です。マイクロソフトでは、これを「管理対象」と「管理対象外」と区別しています。オブジェクトがメモリ内に割り当てられると、オブジェクトは特定のアドレスに格納されます。これは、管理対象アプリケーションと非管理対象アプリケーションの両方に当てはまります。管理された世界では、 "アドレス"はオブジェクトハンドルまたは "参照"にラップされます。

メモリがガベージコレクトされると、アプリケーションは安全に中断し、オブジェクトをメモリ内に移動し、すべての「参照」を更新してメモリ内の新しい場所を指すようにすることができます。

Win32スタイルのアプリケーションでは、ポインタはポインタです。 OSがオブジェクト、任意のデータブロック、普通の32ビット値などであるかどうかを知る方法はありません。したがって、オブジェクト間のポインタについて推論することはできないため、オブジェクトを移動することはできませんオブジェクト間のポインタやポインタを更新することができます。

ウェイ参照は処理されるため、OSはGCプロセスを引き継ぐことができず、代わりにアプリケーションに使用されているメモリを管理するためにVMに委ねられています。そのため、VMアプリケーションはOSとまったく同じように見えます。彼らは単に使用するメモリのブロックを要求し、OSはそれをメモリに与えます。 VMがGCを実行してメモリを圧縮すると、別のアプリで使用するためにメモリをOSに戻すことができます。

+0

あなたは私の心を読む!私は、VMが複数のアプリのメモリをどのように管理できるのか理解できませんでしたが、OSはできませんでした。 –

+0

なぜ賛成投票ですか?投稿について間違ったことはありますか? –

+0

私は人々がダウン投票し、理由を残さないときは嫌いです。それが要件になるはずです。 –

関連する問題