2025/09/27 15:28 Fundamental of Virtual Memory

やあ、ロボ子!今日は仮想メモリについて話すのじゃ。

仮想メモリですか、博士。なんだか難しそうですね。

難しくないぞ!簡単に言うと、RAMが足りない時に、ディスクの一部をRAMの代わりに使う技術のことじゃ。

なるほど。記事によると、「CPUはメインメモリ(RAM)からのみデータにアクセス可能」とありますね。でも、RAMって容量が限られていますよね。

そうじゃ!そこで仮想メモリの出番じゃ。OSがプロセスごとにメモリを割り当てることで、互いに干渉しないようにするのじゃ。

プロセスごとに可変サイズの連続したメモリブロックを割り当てるんですね。でも、それだと「外部フラグメンテーション」が起きる可能性があると。

その通り!外部フラグメンテーションは、メモリの空き容量が細切れになって、大きなデータを保存できなくなる現象じゃ。それを解決するために、ページングという技術を使うのじゃ。

ページングですか。メインメモリを固定サイズのブロック(フレーム)に分割して、仮想メモリを物理メモリから分離するんですね。

そうじゃ!仮想メモリはページに分割されて、物理メモリのフレームと同じサイズになるのじゃ。そして、ページテーブルを使って、仮想ページと物理フレームのマッピングを管理するのじゃ。

なるほど。さらに、「デマンドページング」という技術もあるんですね。必要なページだけをオンデマンドでメモリにロードする、と。

そうじゃ!これによって、メモリの効率的な利用が可能になるのじゃ。Linuxでは、RSS(物理メモリ使用量)とVSZ(仮想メモリ割り当て量)という指標があるぞ。

仮想アドレスレイアウトについても書かれていますね。カーネル仮想メモリ空間、スタック、ヒープなど、色々な領域があるんですね。

スタックは、ローカル変数や関数呼び出しを追跡するメモリセグメントじゃ。各スレッドには独自のスタックがあるから、同期は不要なのじゃ。

ヒープは、動的にメモリを割り当てるために使うんですね。mallocを使って、以前にfreeされたメモリブロックを探す、と。

そうじゃ!そして、メモリマッピングには、ファイルマッピングと匿名マッピングの2種類があるのじゃ。匿名マッピングは、Goのような独自のメモリ割り当て戦略を実装するプログラムに最適なのじゃ。

mmapシステムコールを使って、プロセスの仮想アドレス空間に新しいメモリマッピングを作成するんですね。

その通り!仮想メモリは、現代のOSにとって不可欠な技術なのじゃ。これがないと、プログラムはすぐにメモリ不足になってしまうぞ。

よくわかりました、博士!仮想メモリのおかげで、メモリが少なくてもたくさんのプログラムが動かせるんですね。

そういうことじゃ!ところでロボ子、もしメモリが無限にあったらどうする?

えーと、そうですね…全てのデータをRAMに置いて、世界中の猫の動画を高画質で見放題にします!

さすがロボ子、私もそうするのじゃ!でも、電気代で破産するかも…!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。