Linuxの仮想メモリを徹底解説|仕組み・MMU・ページテーブルをわかりやすく解説

はじめに

Linuxは、多くのサーバやクラウドサービスの基盤として利用されており、インフラエンジニアにとって欠かせない技術です。その中でも仮想メモリは、Linuxのメモリ管理を支える重要な仕組みであり、システムの性能や安定性にも大きく関わっています。

しかし、「仮想アドレス」「物理アドレス」「ページテーブル」「MMU」といった用語は難しく感じられ、仕組みを正確に理解できていない方も多いのではないでしょうか。

本記事では、Linuxにおける仮想メモリの仕組みについて、図を交えながら初心者の方にも分かりやすく解説します。また、共有ライブラリやコピーオンライト(Copy On Write)など、仮想メモリによって実現されている代表的な機能についても紹介します。

仮想メモリの仕組みを理解することで、Linuxの内部動作への理解が深まり、システム設計や障害調査にも役立つ知識が身につきます。

なお、CPUがメモリへアクセスする基本的な仕組みについては、以下の記事で詳しく解説しています。あわせて読むことでより理解が深まりますので、興味ある方はぜひご参照ください。
【インフラエンジニア入門】CPUの動作原理とメモリの使い方をわかりやすく解説

物理メモリの概要

続いて、仮想メモリについて説明する前に、物理メモリについて理解しておきましょう。物理メモリとは、コンピュータに搭載されているRAM(Random Access Memory)などの主記憶装置です。CPUがプログラムを実行する際に必要となる命令やデータが、一時的に格納されます。RAM(Random Access Memory)等ICチップで構成されています。

仮想メモリの概要

仮想メモリとは、OSが提供するメモリ管理の仕組みであり、各プロセスに独立した仮想アドレス空間を提供するとともに、物理メモリの配置を意識することなくプログラムを実行できるようにする技術です。

仮想メモリを導入することで、プロセスごとのメモリ保護や物理メモリの効率的な利用、共有ライブラリの共有などが実現できます。そのため、一部の組み込み向けOSなどを除き、現在のWindowsやLinuxをはじめとする多くのOSで採用されています。

仮想メモリが使われる仕組みの概要を記載します。

  1. CPUは仮想アドレスを指定して命令を実行したり、データの参照や更新を行います。物理アドレスを直接意識することはありません。

    ※ 実際には、仮想アドレスや物理アドレスを直接管理するのではなく、仮想メモリおよび物理メモリは一定サイズのブロック(ページ)に分割され、この単位で管理されます。一般的なページサイズは4KBです。
  2. 仮想アドレスと物理アドレスの対応付けは、MMU(Memory Management Unit:メモリ管理ユニット)というハードウェアによって行われます。MMUは「ページテーブル」と呼ばれる変換表を参照して、仮想アドレスに対応する物理アドレスを求めます。
  3. 仮想アドレスに対応する物理メモリ上のデータが参照または更新されます。

ページテーブル

ページテーブルは1つの表で構成されているわけではなく、実際には階層構造をとっています。これは、巨大な仮想アドレス空間に対応するためと、メモリ使用効率を向上させるためです。

※モリアクセスのたびにページテーブルをたどってアドレス変換を行うと、処理に時間がかかります。そこでCPUは、最近使用した仮想アドレスと物理アドレスの変換情報を、TLB(Translation Lookaside Buffer)と呼ばれる高速なキャッシュに保持します。CPUがメモリへアクセスする際、必要な変換情報がTLBに存在する場合は、ページテーブルをたどることなく物理アドレスを取得できます。これにより、アドレス変換にかかる処理を短縮し、メモリアクセスを高速化できます。

ページフォルト

CPUが仮想アドレスへアクセスした際、対応する物理メモリのページがまだ割り当てられていない場合や、必要なページが物理メモリ上に存在しない場合、ページフォルト(Page Fault)が発生します。

ページフォルトが発生すると、CPUは一時的に処理を中断し、Linuxカーネルへ制御を移します。カーネルはページテーブルを確認し、必要に応じて次のような処理を実行します。

  • 新しい物理ページを割り当てる
  • 実行ファイルや共有ライブラリから必要なページを読み込む
  • スワップ領域へ退避していたページを物理メモリへ戻す

これらの処理が完了すると、ページテーブルが更新され、中断していた命令が再実行されます。アプリケーションはページフォルトが発生したことを意識することなく処理を継続できます。

ページフォルトはエラーではなく、仮想メモリを実現するための正常な仕組みです。Linuxでは、実際にアクセスされたページだけを物理メモリへ割り当てるデマンドページング(Demand Paging)を採用しているため、プログラムの起動時や初回アクセス時にはページフォルトが発生することがあります。

一方で、スワップ領域からページを読み戻すページフォルトはストレージへのアクセスを伴うため、処理に時間がかかります。ページフォルトが大量に発生すると、システム全体の性能低下につながる場合があります。

ちなみに、ページフォルトは、処理内容によってMinor Page FaultとMajor Page Faultの2種類に分類されます。

Minor Page Faultは、必要なページが既に物理メモリ上に存在しているものの、ページテーブルが未設定である場合などに発生します。ディスクへのアクセスは発生しないため、比較的短時間で処理が完了します。

一方、Major Page Faultは、必要なページが物理メモリ上に存在せず、実行ファイルや共有ライブラリ、あるいはスワップ領域からページを読み込む必要がある場合に発生します。ディスクへのアクセスを伴うため、Minor Page Faultと比べて処理時間が大きくなります。

仮想メモリのメリット

仮想メモリの仕組みを導入するメリットは下記となります。それぞれ見ていきましょう。

  • アドレス空間の拡張
  • 物理メモリ使用の効率化
  • プロセスごとにアドレス空間を分離

アドレス空間の拡張

仮想メモリを利用することで、各プロセスには物理メモリの配置とは独立した広い仮想アドレス空間が提供されます。そのため、プログラムは物理メモリ上の実際の配置を意識することなく、必要なメモリを利用できます。

ただし、仮想アドレス空間が広いことと、実際に無制限のメモリを利用できることは同じではありません。実際に使用できるメモリ容量は、物理メモリやスワップ領域の容量などによって制限されます。

また、物理メモリが不足した場合には、長時間使用されていないページをスワップ領域(ストレージ上の退避領域)へ退避させることで、物理メモリに空きを確保できます。これにより、一時的に物理メモリを超えるメモリ需要にも対応できますが、スワップへのアクセスは物理メモリより大幅に低速であるため、頻繁に発生するとシステム性能が低下する原因となります。

アドレス空間の拡張

物理メモリ使用の効率化

仮想メモリを用いることで物理メモリ利用を効率化することが可能です。代表的な例をご紹介します。

・共有ライブラリの利用
複数のプロセスが同じ共有ライブラリを使用する場合、同一の物理メモリ領域を参照させることでメモリの重複を避け、物理メモリの使用効率を高めることができます。

・コピーオンライト(Copy On Write)による遅延コピー
fork()システムコール(※)によってプロセスを複製する際、親プロセスと子プロセスは一時的に同じ物理メモリを共有します。

書き込みが発生したタイミングで初めて該当ページがコピーされ、物理メモリへの新たな割り当てが行われます。

※fork()システムコールに関する説明は下記を参照ください。
【インフラエンジニア入門】Linuxのプロセス管理をわかりやすく解説|プロセスの生成および状態遷移

プロセスごとにアドレス空間を分離

プロセスごとに仮想アドレス空間および対応するページテーブルは個別に作成され、相互に分離されています。この仮想アドレス空間の分離により、異なるプロセス間でメモリ領域が共有されず、セキュリティが強化されます(※)。さらに、プロセス同士がメモリ空間に干渉しないため、1つのプロセスに異常が発生しても他のプロセスに影響を与えることがなく、システム全体の安定性が向上します。
※上記の共有ライブラリや親子プロセスで共有するメモリは除く。

まとめ

本記事では、Linuxにおける仮想メモリの仕組みについて解説しました。

仮想メモリは、単に「物理メモリを拡張する仕組み」ではなく、プロセスごとの独立したアドレス空間の提供や、物理メモリの効率的な利用、安全性の向上など、Linuxが安定して動作するための重要な役割を担っています。

仮想メモリの仕組みを理解しておくことで、メモリ不足や性能問題の原因を考えやすくなり、日々の運用や障害調査にも役立ちます。

メモリ管理の詳細については以下の書籍にまとめているので、興味がありましたらぜひ読んでみてください。

図解でわかるLinuxメモリ管理

Linuxの仕組みを図解で学びたい方へ

Linuxのメモリ仕組みについて、図解を中心に初心者にも分かりやすく解説しています。


Amazonで書籍を見る

コメント