仮想メモリは実際にメモリ空間をどのように増やしていますか?


70

仮想メモリは、実際に利用可能なメモリよりも多くのメモリを表示することでプログラムをだますことを理解しています。

しかし、最終的には論理アドレスを実際の物理アドレスにマップする必要があります。今、それはどのようにメモリを増やしていますか?


12
それが古いコンセプトです。仮想メモリに対する当初の動機は、物理メモリよりも大きなアドレス空間を提供するメモリ管理の形式でした。しかし、それはメモリが低密度で非常に高価なときでした。現在、仮想メモリを使用する主な理由はプロセスのセキュリティです。
おがくず

2
「今、それはどのようにメモリを増やしていますか?」そうではありません。アプリケーションはシステムの物理メモリを認識せず、仮想メモリのみを認識します。これは、アプリケーションが物理メモリではなく仮想メモリについて話しているのに十分なメモリがないと不満を言う理由です
-Ramhound

2
仮想メモリシステムは非常にスマートであることに注意してください。n個のプロセスが同じ読み取り専用ページを持っている場合、n個すべてのプロセスが物理メモリの同じ1ページを使用できます。
エリックリッパー

65
仮想メモリをだましていると考えないでください。 メモリは、データを保存および取得する抽象的な機能です。仮想メモリは、その抽象化の実装を提供します。その抽象化の一部がRAMによって支えられ、一部がディスクによって支えられていることは、抽象化の実装の詳細です。
エリックリッパー

4
@HagenvonEitzenメモリがどのようにディスク上に「常に」あるのかわからない...ディスクから最初に読み取られたページは別として、ページがスワップアウトされない限り、その内容は決してディスク上にないかもしれません。カーネル機能にとって重要であるため。
マイケル

回答:


116

物理メモリはまったく増加していません。その目的はまったく別のものです。できることは、プログラムが物理的に利用できるよりも多くのメモリを使用できるようにする他のバッキングストアを利用可能にすることです。

仮想メモリは、プロセスを互いに分離および分離するために使用され、メモリアクセスを別の場所に流用することもできます。

仮想メモリを使用すると、システムはすべてのプロセスに他のプロセスから隔離された独自のメモリ空間を与えることができます。プログラムが独自のスペースで効果的に動作しているため、「同じ」アドレスを使用する必要がある他のプログラムを回避するのではなく、アドレススペース全体に完全にアクセスできます。これには、プロセスが相互に容易に干渉できないため、信頼性とセキュリティが向上するという副作用があります。

アプリケーションの仮想メモリ空​​間は、必要に応じて構築されます。アプリケーションは(それ自体に対して)単一の連続したメモリブロックにあるように見えますが、実際には物理メモリ全体に完全に散在している可能性があります。

また、仮想メモリを使用すると、メモリアクセスをトラップして迂回させることができるため、スワップファイルなどの機能を使用できます。つまり、最近使用されていないメモリの一部をディスクにプッシュし、「このメモリブロックはファイルxの位置yにあります」というポインタを設定し、物理メモリを解放できるということです。別のアプリケーションが使用する領域。アプリケーションがそのメモリを必要とする場合、ディスクから読み戻し、物理RAMのある場所(以前とは異なる可能性がある)に配置し、以前と同じ仮想メモリの同じ場所にマップし直すことができます。

ページファイルが使用されるのと同じ方法で、仮想メモリを使用すると、オペレーティングシステムがプログラムの共有ライブラリを効果的に「遅延」ロードすることができます。メインプログラムがオペレーティングシステムに特定のライブラリを使用するように指示すると、オペレーティングシステムはライブラリの要件を確認し、アプリケーション全体の仮想メモリ領域にスペースを割り当てることで時間を節約できますが、ライブラリ全体をロードするのではありませんライブラリ内のページを実際に必要になるまでディスクから読み込むことを延期できます。このように、ライブラリのRAMにロードされる部分は、実際にプログラムで使用される部分のみです。使用されない部分はロードされないため、RAMを無駄にしないでください。

これらの手法を使用することで、システムの安定性が向上し、互いに過度に影響することなく、より多くのプロセスを限られたスペースで実行できます。「メモリを増やす」のではなく、所有しているものをより効果的に使用できます。

スワップファイルは仮想メモリシステムによって有効にされますが、以前は仮想メモリであると混同されていました。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
サティアジスバート

21

レイマンの説明

システムは、そのメモリが使用されるときに各仮想アドレスを物理アドレスにマップする必要があります、すべてのメモリが同時に使用されるわけではありません。たとえば、ブラウザに20個のタブがあり、それぞれが1GBのメモリを消費するとします。仮想メモリをサポートしていないOSでは、これが機能するために20GBのRAMが必要です。秘Theは、20のタブすべてを同時にブラウズしないことです。したがって、仮想メモリを搭載したOSでは、わずか数GBのRAMでそのようなブラウザを使用して、非アクティブなタブをディスクにスワップできます。

より複雑な側面

仮想メモリはスワッピング専用ではありません。主な目的は、実際にはRAMの断片化を回避することです。これは、仮想メモリ管理のないシステムでは大きな問題です。1GBのRAMが十分にある場合もありますが、 。

時間の経過とともに、仮想メモリはさらに多くの用途、特にランダムなファイルアクセスを発見しました:データベースなどの多くのアプリケーションは、ファイルを順番に読み取らなければならない場合は非常に遅くなり、OSがファイル全体が(仮想)メモリおよびアクセスパターンに基づいてディスクIOとキャッシュを最適化します。


9
ブラウザの各タブに1 GBのメモリが必要な世界に住んでいるのは残念です
-tbodt

9
@tbodt古代エジプト人のせいだ。それらの厄介な猫を飼いならすことによって彼らが何をしているのかを知っていれば!
ドミトリーグリゴリエフ

@tbodtそれはちょっと誇張でもあります。8つのタブを開いたブラウザでは、500MBのメモリしか必要ありません。
Random832

2
@ Random832確かにそれは誇張ですが、誇張と将来の保証との境界線はわかりませんが。私の最初のPCには32 MBのRAMが搭載されており、目立ったスワッピングをせずにOperaで8つのタブを簡単に開くことができました。現在は500MB必要なので、さらに20年で8GBに達する可能性があります。
ドミトリーグリゴリエフ

5

実際にメインメモリハードウェアを追加するという意味では、仮想メモリはメモリを増加させません。ただし、使用可能なアドレスの範囲を広げることができます。そう一つのコードセグメントとデータ(スタックおよびヒープ)セグメントからなる実行中のプログラムを有することができ、これらの両方の範囲占めることができ、仮想の範囲よりも大きいアドレス物理の物理的に実記憶空間によって提供されるアドレスを機械。秘Theは、これらの仮想アドレスのごく一部のみが物理的なメインメモリによってバックアップされるということです(ただし、すべては最終的にディスクストレージによってバックアップされます)。これは、参照の局所性の現象のために機能します:いつでも、プログラムセグメントの1つ以上の小さな連続したセクションの命令のみが実行され、データセグメントの1つ以上の小さな連続したセクションのデータのみが操作されます[もちろん、動作は実際にはより複雑です、ただし、このパターンはかなりの時間にわたって続きます]


4

仮想メモリは、実際に利用可能なメモリよりも多くのメモリを表示することでプログラムをだますことを理解しています。

仮想メモリに対する当初の動機は、物理メモリよりも大きなアドレス空間を提供するメモリ管理の形式でした。
ソフトウェアはCPUの完全なアドレス空間(2 ^ 32アドレス空間など)を利用できますが、実際にインストールされた物理メモリはその数のほんの一部でした。
大きなプログラムは、巨大な(インストールされた)メモリ要件を課すことなく、仮想メモリを使用するコンピュータ間で移植可能です。
この仮想メモリの使用は、メインフレームコンピュータとフェライトコアメモリ(物理的に低密度で高価なもの)の時代に遡ります。

しかし、最終的には論理アドレスを実際の物理アドレスにマップする必要があります。今、それはどのようにメモリを増やしていますか?

仮想メモリは、プログラムにより多くのアドレス空間を提供するための単なる技術から進化しました。
仮想メモリは、最新のオペレーティングシステムの各プロセスにセキュリティを提供するための重要なコンポーネントであるため、プロセスが別のプロセスに干渉したり、別のプロセスによって侵害されたりすることはありません。
ただし、仮想メモリを使用したマルチプロセッシング(マルチプロセスorsと混同しないでください)は、物理メモリよりもシステムに明らかなメモリを提供します。

作成された各プロセスには、独自の仮想アドレス空間、つまり独自の仮想メモリが提供されます。
各プロセスに実際に使用される(および仮想メモリにマップされる)物理メモリの量は動的です。通常、プロセスの実行を実行するためのコード(別名テキスト)とデータページ/セグメントを含む仮想メモリのみが物理メモリ(別名メモリに常駐)にマップされます。

不要なコード(現在実行されていないため)およびデータ(参照/処理されていないため)は、常にメモリ常駐である必要はありません。コードおよび/またはデータページ/セグメントをバッキングストアに「スワップアウト」し(HDDまたはSSD上のスワップスペースまたはページファイルなど)、必要に応じて「スワップ(バック)イン」(別名「オンデマンド」) )。

仮想メモリは、それぞれが独自の保護された仮想アドレス空間を持つ多数のプロセス間で有限の物理メモリを効率的に使用できるようにします。これらの仮想メモリの合計は、通常、インストールされている物理メモリよりも大きくなります。
「メモリの増加」は、プログラムの観点だけでなく、システムの観点からのものです。


3

仮想メモリは、プログラムがアドレスできるデータの量を増やします。ソフトウェアの観点からは、(一般的に)データの保存場所を気にしません。物理的なDRAMメモリに保存したり、マシンに接続したフラッシュドライブに保存したり、回転するプラッターに保存することもできます。ソフトウェアが気にするのは、そのデータへのアクセスを要求すると成功するということです。

実際には、プログラムの高速実行も必要です。以下のために高速データがどこにあるの考慮、我々は注意してください。最も頻繁にアクセスするデータは、最速のアクセスを許可するハードウェアに保存する必要があります。私たちのプログラムはなりたいと DRAMの外に完全に実行します。ただし、これを行うのに十分なDRAMがないことがよくあります。仮想メモリはソリューションです。

仮想メモリでは、オペレーティングシステムはしばらく使用されていないデータを「ページング」して、ハードディスクに保存します。これはまだアクセス可能で、遅いだけです。プログラムがハードディスク上のデータを要求した場合、オペレーティングシステムはディスクからデータを読み取り、DRAMに戻すために時間をかける必要があります。

理論的には、ディスクから直接データを読み取ることができます。しかし、そうしないのには理由があります。プログラムは、これらすべての合併症を認識する必要はありません。私たちは、データをディスク上にインテリジェントに配置するソフトウェアを作成できます(キャッシュと呼ばれます)。ただし、多くの追加作業が必要です。コードでできる最速は次のとおりです。

if data is not in memory
    read data from disk into memory
operate on data

抜け目のない読者は、データがメモリ内にある場合でも、データが存在するかどうかを確認するための条件が必要であることに気付くでしょう。これは、メモリ内で直接操作するよりもはるかに遅いです!

仮想メモリは、CPUのハードウェアをチェックすることでこの問題を解決します。CPUは、ハードウェアを専用にすることができるため、この仮想メモリ操作を非常に迅速に行うことができます。ソフトウェアだけでこれを行うには、CPUの汎用部分を使用する必要があります。これは、当然、専用のトランジスタよりも低速です。

これは、ディスクからデータを読み込んでそのまま残すのではなく、常にデータをページングしてメモリに戻す理由につながります。メモリを「ページ」に分割します。各ページは、メモリ内に存在するか存在しないかのいずれかとしてマークされます。オペレーティングシステムは、CPUが直接使用するのに便利な形式でこのテーブルを維持します。プログラムが存在するデータにアクセスするたびに、CPUのハードウェアはDRAMのデータに直接アクセスします。データが存在しない場合、「ページフォールト」が発行され、オペレーティングシステムにディスクのそのページをメモリの物理ページにロードし、テーブルを更新してこの新しい物理ページでCPUを指すように指示します。

この問題全体の鍵は、その使用を最小限にすることです。実際には、オペレーティングシステムは、メモリに保持するデータとディスクにページアウトするデータの選択に非常に優れているため、ページフォールトを発生させることなくメモリアクセスの大部分が発生します。


2

これは、マップエントリを一時的にすることによって行われます。

プログラムが論理アドレスにアクセスすると、CPUは対応する物理アドレスをマップで探します。見つかった場合、メモリアクセスは期待どおりに進みます。見つからない場合は、物理アドレスを割り当てて、コンテンツを他のストレージ(「スワップスペース」)からロードする必要があります。すべての物理アドレスがすでにいくつかの論理アドレスに割り当てられている場合、物理アドレスを使用可能にするには、一部の論理アドレスを「スワップアウト」する必要があります(内容はスワップスペースに保存されます)。

割り当てられる最大メモリはスワップ領域のサイズであり、インストールされているメモリよりもはるかに大きくなる可能性があります。スワップ空間を「実際の」メモリと考え、RAMをスワップ空間の高速キャッシュと考えると役立つ場合があります。

(これは完全な説明とはほど遠いもので、関連するが不必要な詳細に入ることなく、即時の質問に答えることを意図しています。


1

基本的な概念は、最新のCPUが「特定のプロセスが使用するために割り当てられたアドレス範囲と、物理バス(メモリバス上のA00..Axx行を考えてください)を追跡する変換テーブルを管理できるという事実に依存しています。現在、実際にデータを保存するために使用されます「なし」は可能かつ許容可能な状態なので、「IF ANY」:この場合、ハードウェアレベルでエラー状態(いわゆる「ページフォールト」)が発生します-このエラーはOSレベルのハンドラーをトリガーします。たとえば、スワップファイルに書き込まれたメモリーの内容を物理メモリーの任意の空き場所に読み込み(読み込みの場合)、実際に置く場所を見つけます(読み込み中)書き込みの場合)、前述の変換テーブルを更新し、そして、そのメモリにアクセスしようとしたプロセスに制御を戻すのはTHENだけです。


1

仮想メモリ:

1)大量の仮想アドレス空間をより少ない量の物理メモリにマッピングし、過剰な「スワップアウト」をディスク、SSD、または将来的にNVRAMや他のデバイスに割り当てることができます。

2)より大きな仮想アドレス空間(64ビットなど)をより小さな物理アドレス空間(32ビットまたは64ビットなど)にマッピングできるようにします

3)より小さな仮想アドレス空間(32ビットなど)をより大きな物理アドレス空間(40ビットなど)にマッピングできるため、古いアプリケーションでより多くの物理DRAMを利用できます。

4)物理アドレス空間で断片化され、非連続である物理メモリを仮想アドレス空間で連続させることができます。

5)プロセスに独自の仮想アドレス空間を与え、それによりプロセスを互いに分離できるようにします。

6)同じデータ値を共有するさまざまな仮想アドレスが、単一の物理ページに割り当てられるようにします。

これは、単一のプロセスまたはOS内で発生する可能性があります-ほとんどのBSD UNIX派生OSには、ゼロの単一の読み取り専用ページがあり、通常はCOW(書き込み時にコピー-読み取り専用ゼロ、トラップされた書き込み)ページを共有せずに書き込み可能にします)。

プロセス間で発生する可能性があります。たとえば、UNIX fork()は、ほぼすべての仮想メモリをCOW方式で共有する子プロセスを作成します。

OS間で発生する可能性があります。たとえば、仮想マシンホスト上のゲストOSは、ページの重複排除、COWの共有などを行うことができます(最近のセキュリティ攻撃のいくつかはこれを利用しています)。

7)仮想メモリにより、仮想アドレス空間の一部をファイルにマッピングしたり、同じマルチプロセッサシステム内であれ、インターネット全体であれ、他のプロセッサにマッピングされたメモリにマッピングしたりできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.