46

私はこれらのトピックを学んでおり、多くの記事や本を読んでいますが、それらには補完的な情報が欠けていて、さらに混乱しました. そこでここで、私が質問をしている間に私が知っていることを説明したいと思います。このトピックが私のような多くの人にとって役立つことを願っています。また、必要に応じて、自分の知識の有効性と修正を学びたいと思います。

仮想メモリ

一部の記事では、「仮想メモリは、物理メモリをエミュレートするハードディスクの一部の領域であり、実際よりも多くのメモリを使用できるようになっています。」と書かれています。他の記事では、「仮想メモリは物理メモリ (RAM) の組み合わせであり、物理メモリとページ テーブルのように機能するハードディスクのセクションです」と書かれています。しかし、それらは異なるものであり、なぜそのような異なる説明があるのか​​ わかりません。

ウィキペディアが仮想メモリを説明する方法でもあるため、2番目の説明に進みましょう。この時点で、物理メモリではなく仮想メモリのアドレスを直接使用するため、仮想アドレスは理にかなっています。

ところで、私の Mac は 8GB の物理メモリと 8GB の仮想メモリを搭載していると言っています。この場合、VM には物理メモリが含まれますか、それともメモリとして使用される HD の容量ですか? プログラム用に 16GB のメモリを使用できますか?

ここに画像の説明を入力

質問1:

Intel i5 には 36 ビット アドレス バスがあり、これは 64GB メモリをアドレス指定できることを意味します。コンピューターに 4GB の RAM をインストールしたとします。ただし、メモリのサイズが異なる多くの異なるシステムで使用されるため、私のプログラムはインストールされているメモリのサイズを認識していない場合があります。ここで、仮想メモリが便利になります。インストールされているメモリの実際のサイズを抽象化します。

しかし、プログラムがメモリ アドレス 0xFFFFFFFFFF にアクセスしたい場合はどうなりますか? 4GBしかインストールされておらず、おそらくHDにメモリスペースがあります。

この質問には2つの理論があります。

1.ページ テーブルは OS によって維持されるため、OS はそのアドレスをデコードし、ページ テーブル内のそのページをチェックして、物理アドレスが関連付けられているかどうか (有効フラグと無効フラグ) を確認します。次に、ページエントリが指す物理メモリ内の物理アドレス + 仮想アドレスで定義されたオフセットに移動し、その値を取得します。そうしないと、ページ フォールトが発生し、OS はセカンダリ ストレージでそのページを探し、フェッチしてメモリに配置し、ページ テーブルを更新します。

2. OutOfMemory タイプの例外をスローします。これは、指定されたアドレスがアドレス指定できるメモリがないことを示しています。

最初の理論の欠点は、プログラムが 64 GB のメモリを使用したい場合に何が起こるかということです。次に、4GB しかないため、HD に 60GB のメモリ容量が必要です。ただし、下のスクリーン ショットでは、MAC は 8GB の仮想メモリしかないことを示しています。

質問2:

プロセスはどのように仮想メモリに配置されますか? つまり、各プロセスには 0x0 - 0xFFFFFFFFF の仮想メモリ空​​間があり、すべてのプロセスが配置される仮想メモリ アドレス空間は 1 つしかありません。

各プロセスがすべてのメモリを利用できると仮定すると、メモリは次のようになります。

ここに画像の説明を入力

仮想メモリの概念が 1 つしかない場合、次のようになります。

ここに画像の説明を入力

ページテーブル

したがって、ページテーブルは、物理アドレスと仮想アドレスの間にあるデータ構造です。これは、各ページ (キー) に関連付けられた物理アドレス (値) がある連想配列 (または辞書のようなもの) です。

OS は MMU (メモリ管理ユニット) を使用して、この仮想アドレスから物理アドレスへの変換を実行します。

ここに画像の説明を入力

質問 3:

すべてのプロセスのすべてのページを含む 1 つの巨大なページ テーブルがありますか、または各プロセスに独自のページ テーブルがありますか?

ページング

ページングは​​メモリ管理方法です。仮想メモリと物理メモリは、メモリ管理ユニットによってページ (固定で同じサイズのブロック) に分割されます。この手法は、メモリとセカンダリ ストレージの間でページをスワップして、それらの間でページをスワップできるようにする場合に役立ちます。たとえば、プログラムはアドレスにあるデータを要求します。ただし、プログラムが使用しているアドレスは仮想アドレスであり、MMU はページ テーブルを使用してそれを変換します。この間、MMU は要求されたものがページ テーブルに存在するかどうかをページ テーブルでチェックし、存在しない場合は OS がセカンダリ ストレージから取得してページ テーブルを更新します。

質問 4:

プロセスがアドレスからのデータを要求し、そのアドレスがすでにデータを持っている物理アドレスに変換されたとします。データがリクエスタ プロセスに属しておらず、2 次ストレージにあるデータに置き換える必要があることは、どのようにしてわかりますか?

たとえば、そのページをハードディスクに書き戻すかどうかに使用されるダーティビットがありますが、所有者プロセスを決定するものではないと思います。

4

2 に答える 2

17

ページ ファイルは割り当てられたメモリの一部であり、「実際の」メモリ (つまり RAM) ではないため、「仮想メモリ」という用語をページ ファイルと同義であるかのように使用する人もいます。しかし、ほとんどの人は、「仮想メモリ」を、オペレーティング システムがプログラムに与える、RAM とページ ファイルを組み合わせた抽象化レイヤー全体であると考えています。

これらの定義のどれが Mac OS で支持されているかはわかりませんが、お使いのコンピューターにページ メモリが割り当てられていない可能性は低いと思われるため、実際の 8 GB の RAM に 8 GB のページ メモリが追加されているのではないかと推測しています。 、合計 16 GB の使用可能な (仮想) メモリ。

オペレーティング システムはメモリの割り当てと割り当て解除の要求を管理するため、必要なことは何でも自由に行うことができることに注意してください。私の理解では、ほとんどのオペレーティングシステムはプロセスごとに異なるメモリ割り当てテーブルを持っているため、文字通り同じ仮想メモリアドレスを複数のプログラムに与えることができますが、それらのメモリアドレスはメモリ内の異なる実際のブロックにマップされます. そのため、64 ビット オペレーティング システムは、最大量の 32 ビット アドレスを複数の 32 ビット プログラムに割り当てることができます。すべてが同じ 32 ビット メモリ アドレスに制限されているわけではありません。

ただし、制限があります。オペレーティング システムでは、ページ ファイルが拡張できるサイズに制限が設定されている場合があります。そのため、オペレーティング システムに意図的にそうするように指示しない限り、おそらく合計 64 GB の仮想メモリはありません。仮に割り当てられたとしても、すべてのプログラムに 64 GB をすべて割り当てることはできないためOutOfMemory、OS が仮想アドレスを0xFFFFFFFFFプログラムに割り当てる前にエラーが発生する可能性が高くなります。0xFFFFFFFFF(実際、これがに似た予約済みのエラー コードの場所であることを知っても驚かないでしょう0x0)。プログラムが考えるメモリアドレスが割り当てられることになります0xFFFFFFFFF、オペレーティング システムがそれほど多くのメモリを使用していない場合でも。

すべてのプロセスのすべてのページを含む 1 つの巨大なページ テーブルがありますか、または各プロセスに独自のページ テーブルがありますか?

おそらく両方...そしていくつか。

  1. 各プロセスには専用のメモリ テーブルがあり、OS はプログラムがこのテーブルに割り当てられていないメモリ アドレスにアクセスするのを積極的に防ぎます。
  2. 共有メモリなどもあるため、同じ情報を使用する必要がある2つのプロセスが共有メモリの領域を作成し、そのメモリ空間のアドレスを両方からアクセスできるようにすることができます。
  3. オペレーティング システム自体は、使用可能なメモリ全体の量、空き/使用されているアドレス空間、および RAM またはページ ファイル内のどの場所にどの仮想メモリ ブロックが割り当てられているかを追跡する何らかの方法を明らかに必要としています。

したがって、プロセスが address にメモリを割り当てられていると仮定すると、プロセスが0x00000002そのメモリ アドレスから値をロードしようとすると、オペレーティング システムは、これが実際に実際のメモリ アドレスにマップされていることを認識する可能性が0x00000F23あります。 CPUレジスタにフェッチされます。または、そのアドレスを含むページがディスクのどこかに移動したことを認識できます。この場合、オペレーティング システムはメモリの空き部分を見つけて、最初にディスクからそのメモリにページのデータをロードします。(繰り返しますが、このメモリ アドレスは、プログラムが要求した元のメモリ アドレスとは何の相関関係もありません。)

ページをプルするための空のメモリがない場合、OS は最初にデータをメモリからページ ファイルに移動する必要があります。近い将来に使用される可能性が最も低いメモリをインテリジェントに判断しようとします。しかし、メモリがディスクにスワップされた直後に絶えず要求され、プログラムが要求しようとしていた次のメモリを置き換えるだけになることがあります。この「スラッシング」は、ディスク アクセスがメモリ アクセスよりも桁違いに遅いため、メモリが不十分なコンピュータの動作が非常に遅くなる原因です。

于 2014-03-11T23:17:04.070 に答える