2012-03-18 17 views
6

メモリ内のDLLサイズとハードディスク上のサイズの間には関係がありますか? >モジュール、そして私は、このEXEが使用しているすべてのDLLを見ることができます - 私は、タスクマネージャの拡張機能(MS)を使用しています、と私はリストと右クリックでEXEに行くことができるので、メモリ内のDLLサイズとハードディスク上のサイズ

です。長さの列はありますが、バイト単位ですか? DLLの値(Length)は、ハードディスクの(DLL)サイズとは異なるようです。どうして?

+1

dllが動的割り当てを実行する場合は、そのDLLをインクルードしようとしていますか? –

+0

例を挙げることができますか? 「長さ」列はファイルサイズよりも小さいですか?より大きい? 4Kの次の倍数に切り上げましたか? 2つの数字の間にはどんな関係がありますか? –

+0

@Andre:例を挙げると、TMExtentionのディスク上のMSVCR80は632565バイトで、634880が表示されます。また、TAExtentionは、長さの異なるMSVCP71.dllのコピーを2つ表示しました。 1つは503808で、もう1つは352256で、ディスク上では実際には503808です(TMExtentionにリストされているものと同じです)。 – Gob00st

答えて

5

関係はありますが、完全には直接的ではありません。

DLLを初めて使用すると、メモリにマップされます。これはメモリにロードされず、必要に応じてロードできる/ロードできるプロセス内にいくつかのアドレス空間を割り当てます。次に、DLLの個々のページがデマンドページングを介してメモリにロードされます。つまり、割り当てられたアドレス空間の一部を参照すると、そのアドレスにマップされたコード(またはデータ)がロードされますそれがまだ記憶されていなければ。

ここで、アドレスマッピングは少しスペース(マップされるアドレス空間のメガバイトごとに1つの4Kページ)を占有します。もちろん、いくつかのデータをメモリにロードすると、それもメモリを使い果たします。

しかし、ほとんどのページはプロセス間で共有することもできるし、5つの異なるプロセスで同時に使用する場合は5回(つまり、それを使用する各プロセスに1回)メモリには物理コピーが1つしか存在しません(少なくとも通常は)。

これらの間で、特定のDLLのメモリ消費量を正確に把握するのは少し難しい場合があります。

+0

が、RAMには==が入ります。 –

+0

@HansPassant: "メモリ内==ランダムアクセスメモリ"?あなたは何を明確にしようとしていますか? –

+0

"in memory"はかなりあいまいな言葉です。 「RAM内」は、「仮想メモリ/アドレス空間内の」別の解釈の1つです。ここでの問題は、Jerryが2つを対比していることです。 – MSalters

0

「メモリ」とはどのようなものなのでしょうか?また、あなたのTaskManager拡張機能には正確に何が表示されますか。

すべての実行可能モジュール(Exe/Dll)はであり、アドレス空間にが割り当てられています。このマッピングのサイズは、そのサイズと同じです。そして、私はあなたの「拡張機能」があなたに示すものだと思います。

0

通常、メモリフットプリントはディスクサイズより大きくなります。これは、メモリにマップされているとページが整列しているためです。標準のページサイズは4KBと8KBなので、dllが1KBのコードであれば、まだメモリに4KBを使用します。

+0

完全に真実ではないが、ハードドライブにも約4KBのセクタがあります。 – Thomas

+0

@トーマス:私はOPが "ディスクで使用されるサイズ"ではなく、実際のファイルサイズについて話していると思います。 –

+0

@AndréCaron違いはありません。メモリとディスクの両方で同じ概念ですが、どちらもページ/セクタにデータを割り当てます。したがって、「実際のファイルサイズ」は、「アカウントページを使用せずに使用されるメモリ」と同等ですが、あまり有用ではありません。 – Thomas

1

.dllや.exeをメモリにコピーして実行するとは思わないでください。

ローダーのための一連の指示と考えることができます。 確かに、プログラムと静的データのテキストが含まれています。 もっと重要なのは、そのテキストが再配置され、満たされていないすべての参照が接続され、他のモジュールが必要とする可能性のある参照をエクスポートできるようにするためのすべての情報が含まれていることです。

デバッグ用のシンボルと行番号の情報がある場合は、まだそれ以上のテキストです。

一般に、メモリイメージよりも大きいと予想されます。

2

メモリ内のDLLのサイズを決定する際に遊びに来て二つの部分があります。

  1. 誰もがDLLのgetメモリがマッピングされ、指摘されたように、これはの上に整列thierサイズビーイングページ(につながるが、その日の後ろからの好ましいロードアドレスをページアライメントしなければならない理由)。一般に、32ビットシステムの場合は4Kb、64ビットシステムの場合は8Kbです(ウィンドウの詳細はthisを参照してください)。
  2. dllには初期化されていないデータのセグメントが含まれています。このセグメントは、dllがロードされて初期化されると、通常はベース+サイズに圧縮されます。.bssセグメントの領域が割り当てられ、一般的にこれは小さく、ページアライメントには欠けていますが、dllに巨大な静的バッファが含まれていると、仮想化されたサイズになってしまいます。
+0

ポイント#2は面白いです。私はもっ​​と知りたいです。あなたはこれを読むための参照がありますか? –

+1

@AndréCaron:そのわずかなコンパイラ/実装固有なので、私が与えることができるのはウィキペディアのリンクです:http://en.wikipedia.org/wiki/.bss – Necrolis

関連する問題