Linuxメモリ管理を徹底解説|仮想メモリ・ページキャッシュ・Swap・OOM Killerの仕組み

はじめに

Linuxを学習する上で、メモリ管理の仕組みを理解することは非常に重要です。

しかし、「仮想メモリ」「ページキャッシュ」「Swap(スワップ)」「OOM Killer」といった用語を耳にしたことはあっても、それぞれがどのような役割を持ち、どのように連携して動作しているのかを体系的に理解する機会は多くありません。

例えば、freeコマンドを実行すると空きメモリがほとんどないように見えたり、Swapが使用されていたりして、「本当にメモリ不足なのだろうか?」と疑問に思った経験がある方も多いのではないでしょうか。また、システムが突然遅くなったり、OOM Killerによってプロセスが強制終了されたりする場面では、Linuxのメモリ管理の仕組みを理解しているかどうかが、原因究明のスピードを大きく左右します。

Linuxは、限られた物理メモリを効率よく活用するために、仮想メモリやページキャッシュ、Swapなど、さまざまな仕組みを備えています。これらは単独で動作しているわけではなく、互いに連携しながらシステム全体の性能と安定性を支えています。

本記事では、Linuxメモリ管理シリーズの導入編として、Linuxにおけるメモリ管理の目的や全体像を解説します。仮想メモリやページキャッシュなどの個々の仕組みについては、後続の記事で詳しく紹介します。

本記事を通して、Linuxメモリ管理の全体像を把握し、それぞれの技術を学ぶための土台を築いていただければ幸いです。

Linuxのメモリ管理とは

Linuxのメモリ管理とは、Linuxカーネルが物理メモリを効率的かつ安全に利用するための仕組みです。

サーバでは、Webサーバやデータベース、アプリケーションサーバなど、多数のプロセスが同時に動作しています。それぞれのプロセスは必要なメモリを確保しながら処理を実行しますが、物理メモリは無限ではありません。

そのためLinuxカーネルは、

  • 必要なメモリをプロセスへ割り当てる
  • 不要になったメモリを解放する
  • メモリ不足を防ぐためにキャッシュやSwapを管理する
  • プロセス同士が互いのメモリへアクセスできないよう保護する

といった役割を担っています。

もし適切なメモリ管理が行われなければ、あるプロセスが他のプロセスのメモリを書き換えてしまったり、物理メモリがすぐに不足したりして、システム全体が正常に動作しなくなってしまいます。

Linuxでは、仮想メモリやページキャッシュなどの複数の仕組みを組み合わせることで、安全性と高い性能を両立しています。

メモリ管理の目的

Linuxのメモリ管理には、主に次の4つの目的があります。

  • 限られた物理メモリを効率的に利用する
  • プロセスごとに独立したメモリ空間を提供する
  • プロセス間の不正なメモリアクセスを防ぐ
  • システム全体の性能と安定性を維持する

例えば、サーバでは数百から数千のプロセスが同時に動作していることも珍しくありません。

Linuxカーネルは、それぞれのプロセスが必要なメモリを安全に利用できるよう管理するとともに、使用されていないメモリをページキャッシュとして再利用するなど、限られたメモリ資源を最大限活用しています。

また、メモリが不足した場合でも、ページ回収やSwapなどの仕組みを利用することで、システムがすぐに停止しないよう工夫されています。

このような仕組みによって、多数のアプリケーションが同時に動作していても、安全かつ効率的なメモリ利用が実現されています。

CPUとメモリの関係

CPUは、プログラムを実行する際にメモリ上へ配置された命令やデータを読み込みながら処理を行います。

例えば、プログラムを起動すると、実行コードや変数などがメモリ上へ配置されます。CPUはメモリから命令を取り出し、演算を実行し、その結果を再びメモリへ書き戻すという処理を高速に繰り返しています。

つまり、メモリはCPUが処理を行うための作業領域です。

CPUがどれほど高性能であっても、必要なデータをメモリから取得できなければ処理を進めることはできません。そのため、LinuxカーネルはCPUが効率よく処理できるよう、メモリの割り当てや解放、キャッシュ管理などを行っています。

CPUが命令を実行する仕組みについては、以下の記事で詳しく解説していますので、興味のある方はあわせてご覧ください。
CPUの仕組みを徹底解説|命令実行(フェッチ・デコード・エグゼキュート)とメモリアクセス

ユーザ空間とカーネル空間

Linuxでは、メモリ空間はユーザ空間(User Space)カーネル空間(Kernel Space)に分かれています。

ユーザ空間では、Webサーバやデータベース、Javaアプリケーションなど、私たちが利用するアプリケーションが動作しています。

一方、カーネル空間ではLinuxカーネルが動作し、次のようなOSの中核機能を担当しています。

  • メモリ管理
  • プロセス管理
  • ファイルシステム
  • ネットワーク通信
  • デバイス制御

アプリケーションは、直接カーネル空間へアクセスすることはできません。

ファイルの読み書きやネットワーク通信、メモリ確保などを行う場合は、システムコールを通じてLinuxカーネルへ処理を依頼します。

このようにユーザ空間とカーネル空間を分離することで、アプリケーションの不具合や不正なアクセスがOS全体へ影響を及ぼしにくくなり、システムの安全性と安定性が確保されています。

プロセスごとに独立したアドレス空間

Linuxでは、各プロセスに独立した仮想アドレス空間が割り当てられています。

例えば、Webサーバとデータベースが同じサーバ上で動作していたとしても、それぞれが独立したメモリ空間を持っています。

そのため、異なるプロセスが同じアドレスを使用していたとしても、お互いのメモリ領域へアクセスすることはできません。

仮にあるプロセスが異常終了したり、不正なメモリアクセスを行ったりしても、その影響が他のプロセスへ及びにくいのは、この仕組みのおかげです。

この「プロセスごとに独立したアドレス空間」を実現しているのが、Linuxの仮想メモリです。

CPUがアクセスする仮想アドレスは、MMU(Memory Management Unit)によって物理アドレスへ変換され、各プロセス専用のメモリ空間が実現されています。

Linuxメモリ管理の全体像

ここまで、Linuxのメモリ管理の目的や、プロセスごとに独立したアドレス空間が提供されることについて説明しました。

しかし、Linuxのメモリ管理は単一の機能だけで実現されているわけではありません。仮想メモリ、ページキャッシュ、Swap、OOM Killerなど、複数の仕組みが連携して動作することで、安全性と高い性能を実現しています。

全体像を図で表すと、以下のようになります。

簡単に用語を説明します。

用語説明
仮想アドレスプロセスが使用する論理的なメモリアドレスです。
仮想メモリプロセスごとに独立したアドレス空間を提供する仕組みです。
Anonymous Pages(匿名ページ)プログラムが動的に確保したメモリやスタックなど、ファイルに対応しないメモリページです。
Page Cache(ページキャッシュ)ファイルデータをメモリ上に保持し、ディスクアクセスを高速化するキャッシュです。
Physical Memory(物理メモリ)コンピュータに搭載されている実際のRAMです。
Page Reclaim不要なページを回収して、物理メモリを確保する処理です。
LRU(Least Recently Used)最近使用されていないページから優先的に回収するアルゴリズムです。
kswapdバックグラウンドでページ回収を行い、空きメモリを確保するカーネルスレッドです。
Direct Reclaimメモリ確保時に、プロセス自身が同期的にページ回収を行う処理です。
ページキャッシュ回収不要なページキャッシュを解放して物理メモリを確保します。
Swap使用頻度の低い匿名ページをディスクへ退避し、物理メモリを空ける仕組みです。
OOM Killerメモリ不足が解消できない場合に、プロセスを強制終了してメモリを確保する機能です。

主要な要素の役割を簡単に見ていきましょう。

仮想メモリ

仮想メモリは、各プロセスに独立したアドレス空間を提供する仕組みです。

CPUは実際の物理メモリ(RAM)ではなく、各プロセスが持つ仮想アドレスへアクセスします。CPUがアクセスした仮想アドレスは、MMU(Memory Management Unit)によって物理アドレスへ変換されます。

この仕組みにより、複数のプロセスが同じアドレスを利用していても、お互いのメモリへアクセスすることはありません。また、プログラムは実際の物理メモリの配置を意識することなく動作できます。

仮想メモリはLinuxメモリ管理の基盤となる機能であり、安全性と柔軟性を実現するために欠かせない存在です。

詳しい仕組みについては、次回の記事でMMU、ページテーブル、TLB、ページフォルトなどを交えながら詳しく解説します。

ページキャッシュ

ページキャッシュは、ファイルアクセスを高速化するためのキャッシュ機能です。

通常、ディスクへのアクセスは物理メモリよりも大幅に遅くなります。そのため、一度読み込んだファイルデータを物理メモリ上へ保持し、再度同じデータが要求された場合はディスクではなくメモリから読み出すことで、高速なアクセスを実現しています。

Linuxでは、空いているメモリを積極的にページキャッシュとして利用します。そのため、freeコマンドで空きメモリが少なく表示されていても、それが直ちにメモリ不足を意味するわけではありません。

不要になったページキャッシュは必要に応じて解放され、新しいアプリケーションへ再利用されます。

Swap

Swapは、物理メモリが不足した際に、一部のメモリページをディスクへ退避する仕組みです。

物理メモリに十分な空きがある間は、基本的にSwapは利用されません。しかし、メモリ使用量が増加すると、長期間使用されていないページなどがSwap領域へ移動され、その分の物理メモリが解放されます。

ディスクへのアクセスは物理メモリよりも大幅に低速であるため、Swapの利用が増えすぎるとアプリケーションの応答性能が低下することがあります。

一方で、Swapには急激なメモリ不足からシステムを保護する役割もあります。そのため、「Swapは使われない方が良い」と単純に考えるのではなく、適切に利用されることも重要です。

OOM Killer

物理メモリとSwapを使い切ると、Linuxは新たなメモリを確保できなくなります。

このような状況では、LinuxカーネルはOOM Killer(Out Of Memory Killer)を起動し、メモリを大量に消費しているプロセスなどを強制終了することで、システム全体が停止することを防ぎます。

突然アプリケーションが終了した場合でも、原因がOOM Killerであるケースは少なくありません。

障害調査では、dmesgやシステムログを確認し、OOM Killerが動作していないかを確認することが重要です。

Linuxメモリ管理はこれらが連携して動作する

ここまで紹介した4つの仕組みは、それぞれ独立して動作しているわけではありません。

例えば、アプリケーションは仮想メモリを利用してメモリへアクセスし、ファイルアクセスではページキャッシュが利用されます。物理メモリが不足すると、Linuxカーネルは不要なページを回収し、それでも不足する場合はSwapを利用します。そして、物理メモリとSwapの両方が不足すると、最後の手段としてOOM Killerが起動します。

このようにLinuxは状況に応じて複数の仕組みを使い分けることで、限られた物理メモリを最大限に活用しながら、システムの安定性と性能を維持しています。

まとめ

Linuxのメモリ管理は、単にメモリを割り当てるだけではなく、安全性と性能を両立するためのさまざまな仕組みで構成されています。

本記事では、その全体像として、ユーザ空間とカーネル空間、独立したアドレス空間、仮想メモリ、ページキャッシュ、Swap、OOM Killerの役割を紹介しました。

メモリ管理の詳細については、以下の通り詳細を記載していますので、合わせて読んでみてください。

記事内容リンク
第1回Linuxメモリ管理の全体像(本記事)本記事
第2回仮想メモリの仕組みLinuxの仮想メモリを徹底解説|仕組み・MMU・ページテーブルをわかりやすく解説
第3回プロセスのメモリレイアウトLinuxプロセスのメモリレイアウトを徹底解説|Heap・Stack・Text・Data・BSS・mmapの役割
第4回Linuxカーネルのメモリ管理Linuxカーネルのメモリ管理とは?ページフレーム・メモリゾーン・Buddy Allocator・SLUBをわかりやすく解説
第5回ページキャッシュLinuxページキャッシュを徹底解説|Page Cache・Dirty Page・Writebackの仕組み
第6回SwapLinux Swapを徹底解説|Swap Out・Swap In・swappinessの仕組み
第7回メモリ不足時の動作(kswapd・OOM Killer)Linuxメモリ不足時の動作を徹底解説|kswapd・Direct Reclaim・OOM Killerの仕組み

コメント