【インフラエンジニア入門】Linuxのメモリ管理をわかりやすく解説|仮想メモリとは

Linuxメモリ管理(仮想メモリの仕組み)

はじめに

Linuxは多くのサーバやシステムの基盤として使われており、インフラエンジニアにとって欠かせない技術です。その中でも「メモリ管理」は、システムが安定して動作するために重要な知識のひとつですが、Linux OSがどのような方法でメモリを管理しているのか、詳細に理解できていない方も多いのではないでしょうか。

本記事では、Linuxのメモリ管理における仮想メモリについて初心者の方でも理解できるように、基本からわかりやすく解説します。ぜひ最後までお読みいただき、日々の業務に役立ててください。

CPUがメモリを使う基本原理については下記にまとめているので、合わせてみてもらえると良いかと思います。
【インフラエンジニア入門】CPUの動作原理とメモリの使い方をわかりやすく解説

物理メモリ

続いて、仮想メモリについて説明する前に、物理メモリについて理解しておきましょう。物理メモリとはコンピュータに搭載されている記憶装置となります。RAM(Random Access Memory)等ICチップで構成されています。

物理メモリイメージ

引用:知らないと恥ずかしい? メモリの「RAM」と「ROM」の違い:明日から使えるITトリビア – ITmedia NEWS

仮想メモリ

仮想メモリとは

仮想メモリとはOSが提供するメモリ管理の仕組みで、プロセスに対して物理メモリの配置に関係なく、連続したメモリ空間が与えられているように見せる技術です。仮想メモリを導入することで様々なメリットがあるため、一部の組み込み系OS等を除く大半のOSで使われています。

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

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

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

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

    ※メモリアクセスのたびにページテーブルを参照すると処理に時間がかかるため、MMUにはTLB(Translation Lookaside Buffer)と呼ばれるキャッシュが備えられています。TLBに最近使用したアドレス変換情報を保存しておくことで、メモリアクセスの高速化が図られています。
  3. 仮想アドレスに対応する物理メモリ上のデータが参照または更新されます。

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

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

アドレス空間の拡張

仮想メモリを利用することで、プロセスごとに物理メモリの制約を超えた大きなアドレス空間を持たせることができます。そのため、プログラムは実際の物理メモリ容量を意識することなく、多くのメモリを必要とする処理も柔軟に実行できます。

また、物理メモリが不足した場合には、スワップ領域(ストレージ上の一時的な退避場所)を活用することで、仮想的により多くのメモリ空間を確保できます。これにより、システムは物理メモリを超えるメモリ需要にもある程度対応できる仕組みとなっています。

アドレス空間の拡張

物理メモリ使用の効率化

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

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

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

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

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

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

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

さいごに

Linuxの仮想メモリに関する説明は以上となります。仮想メモリの機能を正確に理解している人は意外と多くないので、この際にしっかり理解をして現場のトラブルシューティング等に活かしていただければと思います。

他にもLinuxの低レイヤの記事を記載しているので、合わせて読んでみて下さい。
【インフラエンジニア入門】Linuxのプロセス管理をわかりやすく解説|プロセスの生成および状態遷移
【インフラエンジニア入門】Linuxのプロセス管理をわかりやすく解説|リソース制限
【インフラエンジニア入門】Linuxのプロセス管理をわかりやすく解説|スケジューラ機能

参考文献

[試して理解]Linuxのしくみ | 技術評論社
ITシステムやソフトウェアの基盤OSとして幅広く使われているLinux。エンジニアとしてLinuxに関する知識はいまや必須とも言えますが、あなたはそのしくみや動作を具体的にイメージすることができるでしょうか。本書では、Linux OS にお...
動かしながらゼロから学ぶLinuxカーネルの教科書
<10/17新刊>『コンピュータはなぜ動くのか 第2版 知っておきたいハードウエア&ソフトウエアの基礎知識』
『コンピュータはなぜ動くのか』19年ぶり、待望の改訂第2版! 「これからの10年も通用する基本」を身につけよう!

コメント