2011-12-17 8 views
7

32ビットマシンでは、各プロセスは4GBの仮想空間を取得します。この場合、断片化によるトラブルに直面する可能性があることを心配することができます。しかし、64ビットマシンの場合、理論上は膨大なアドレス指定可能な仮想メモリがあるため、64ビットマシンでメモリ断片化がまだ問題になっているのはなぜですか?64ビットマシンでメモリの断片化が問題になるのはなぜですか?

+2

64ビットオペレーティングシステムでは問題ありません。 –

+0

このコメントは回答ではありませんか?既存の答えは、それが64bitの問題であることを暗示しているようです。 – paulm

答えて

5

アクセスしようとする各仮想アドレスは、オペレーティングシステムによって物理メモリにマップされます。物理メモリはページ単位で割り当てられます(サイズは4Kなど)。あなたがオフセット1000000 * nで1バイトを割り当てて1から1000000の間でそれを行うならば(がmmapでそれを行うことができると思います)、OSは物理的に百万ののページを戻さなければなりません。メモリ、これは4Gのようなものです。その物理メモリは他には利用できません。バイトを連続して割り当てた場合は、100万バイトの物理メモリ(256ページ)が必要になります。

正当な理由で4Gを割り当てた後、その一部を割り当て解除して、すべてのページを少しずつ割り当てておくと、同様の悪い状況に陥る可能性があります。完全に空いている物理ページがないため、解放されたメモリを実際に再利用することはできません。それは断片化問題です。

理論上、仮想アドレス1000000と2000000は、物理メモリの同じページにマップされ、断片化を避けることができます。しかし実際には、そして理由があるため、仮想メモリマッピングはページ単位で行われます。あなたはそれについてもっと読むことができます:http://en.wikipedia.org/wiki/Page_table

+0

64ビットには狂った仮想アドレス空間があるので、この問題はありませんか?あなたがTBのラムを持たず、50TBのようにこれを続けていなければ? – paulm

+0

詳細を読む:フラグメント化したときに*物理的なページが無駄になる理由を説明します。 –

+0

ええ、問題は「64ビットマシンでメモリの断片化が問題になるのはなぜですか?だから確かに答えの始まりは "それはありません"でしょうか? – paulm

0

メモリがすべて「無駄」なのは、内部の断片化が多いアプリケーションを考えているからです。このプロセスでは、ワーキングセットがメモリに分散され、そのメモリフットプリントがはるかに高いため、メモリ内のページが増えます。このアプリケーションがRAM内の物理スロットに対して競合している場合(典型的なホーム設定ではマシンはまだ実際には約4〜8GBのRAMしか持たない)、ページのスワップが多くなります。一般的に、メモリの使用量や他のアプリケーションとの競合を避けるために、アプリケーションのメモリ使用量を削減する必要があります。

実際に問題ではない場合もありますが、余分なメガバイトを使用することはできませんが、大きなアプリケーションではすべてが追加されます。状況に応じて、コーディングする内容やプロジェクトの目的に応じてできるだけ断片化を少なくすることが重要かどうかが決まります。

+0

"メモリの断片化"はどうですか?これに対する応答は、malloc、OS、およびハードウェア要因が仮想メモリの割り当てとマッピングにどのように影響するかをカバーするはずです... –

+0

@pst私が理解したところからの質問は、私は間違ってそれを読むことができたが)。 –

関連する問題