私はこれらのトピックを学んでおり、多くの記事や本を読んでいますが、それらには補完的な情報が欠けていて、さらに混乱しました. そこでここで、私が質問をしている間に私が知っていることを説明したいと思います。このトピックが私のような多くの人にとって役立つことを願っています。また、必要に応じて、自分の知識の有効性と修正を学びたいと思います。
仮想メモリ
一部の記事では、「仮想メモリは、物理メモリをエミュレートするハードディスクの一部の領域であり、実際よりも多くのメモリを使用できるようになっています。」と書かれています。他の記事では、「仮想メモリは物理メモリ (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 次ストレージにあるデータに置き換える必要があることは、どのようにしてわかりますか?
たとえば、そのページをハードディスクに書き戻すかどうかに使用されるダーティビットがありますが、所有者プロセスを決定するものではないと思います。