Linux カーネルの機能 | |||
---|---|---|---|
メモリ管理とは
なお、「スワップ領域」は通常、「ストレージの領域の一部」に確保します。
メモリと比較して、ストレージへのアクセスはとても遅いので、スワップが発生するとコンピュータの処理は遅くなります。
ページサイズは以下のコマンドで確認できます。
4096
歴史的には「スワッピング」はプログラム全体を二次記憶に転送(あるいは二次記憶から主記憶に転送)することを意味する[4][5]。
https://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E6%96%B9%E5%BC%8F
1960年代にセグメント方式とページング方式の仮想記憶の概念が登場すると、「スワッピング」という用語はセグメント単位およびページ単位の二次記憶と主記憶間の転送を意味するようになった。今日の仮想記憶はほとんどがページング方式となったため、「スワッピング」は「ページング」とほぼ同義に使われることもある。
Linux カーネルは、メモリ上のキャッシュを解放することで Out Of Memory を回避します。
もし、開放可能なメモリが存在しない場合、OOM Killer が発生します。
物理メモリが連続しているとアクセスが早いため、次の利用に備えて空き領域を連続させます。
仮想メモリ (Virtual Memory)
仮想メモリの役割
仮想メモリの役割は主に以下の3つです。
フラグメンテーションが発生すると、大きなプロセスを割り当てるメモリがなくなります。
※プロセスの割り当ては、メモリが連続している必要があります
仮想メモリでの対策
仮想メモリでは、プロセスをページ単位に分割することで、連続していないメモリ領域にプロセスを割り当て可能とします。
仮想アドレスと物理アドレスの変換
仮想アドレスは次の流れで物理アドレスに変換されます。
※MMUはかつては単体でICチップなどとして提供され、主基板(マザーボード)に装着して使用したが、現代の一般的なCPU製品の多くはMMUの機能を内部に取り込み一体化している。
https://e-words.jp/w/MMU.html
CPU(マイクロプロセッサ/MPU)内部に実装されている。
https://e-words.jp/w/TLB.html
プロセス終了までアクセスしない領域は、物理メモリは無駄に消費してしまいます。これを防ぐためにデマンドページングという方式が採用されてます。
デマンドページングの処理は以下のとおりです。
- プロセス生成時は仮想アドレス空間に対するページのみを記録
- CPU がページにアクセスすると、仮想アドレスに対応する物理アドレスが無いことを検出
- CPU がページフォールトが発生
- カーネルがページに物理メモリを割り当て (ページテーブルを更新)
仮想メモリの方式
仮想メモリは、次の2種類の方式を組み合わせた「ページ化セグメンテーション」で実現します。
- ページング方式
- セグメント方式
つまり、今まで説明してきた方式です。
プロセス (実行中のプログラム) は、次のセグメントを持ちます。
セグメント | 説明 |
---|---|
テキスト | CPU が実行する機械語命令 (プログラム本体) |
データ | 初期化済みの static 変数 or グローバル変数 |
bss | 初期化していない static 変数 or グローバル変数 |
ヒープ | プロセス実行時に動的に確保される領域 (malloc 等) |
共有ライブラリ | 他のプロセスと共有するライブラリ |
スタック | スコープが終了すると消えるデータ (ローカル変数、関数パラメータ、メソッド等) |
セグメント方式は、次のようにセグメント単位でプロセスを管理します。
セグメントをページ単位で分割して管理します。
なお、物理メモリが不足している場合は、ページング (スワップ) が行われます。
ページング対象となるページは、ページ置換アルゴリズムで選択します。
ページ置換アルゴリズム
代表的なページ置換アルゴリズム2つを紹介します。
- First In First Out (FIFO) algorithm
- Least Recently Used (LRU) algorithm
その他のアルゴリズムについては wiki にまとまっているのでご覧ください。
First In First Out (FIFO) algorithm
一番古いページを置き換えるアルゴリズムです。
Least Recently Used (LRU) algorithm
最も長く使用していないページが置換されます。
FIFO と異なり、古いページでも最近利用されている場合は置換されません。
メモリに関するコマンド
仮想メモリの確認コマンド
cat /proc/<プロセス ID>/maps でプロセスの仮想メモリを確認できます。
556eb7400000-556eb755a000 r-xp 00000000 ca:01 111835 /usr/lib/systemd/systemd 556eb775a000-556eb777d000 r--p 0015a000 ca:01 111835 /usr/lib/systemd/systemd 556eb777d000-556eb777e000 rw-p 0017d000 ca:01 111835 /usr/lib/systemd/systemd 556eb7d5a000-556eb7e70000 rw-p 00000000 00:00 0 [heap] 7fd07be12000-7fd07be16000 r-xp 00000000 ca:01 12584301 /usr/lib64/libuuid.so.1.3.0 (中略) 7ffc7809e000-7ffc780bf000 rw-p 00000000 00:00 0 [stack]
以下のセグメントで管理されていることが確認できます。
なお、パーミッションが r-xp のものはテキストセグメント、rw-p のものはデータセグメントです。
The r-xp region at 0x400000 is your text (code) section. It's readable, and executable, but not writable.
The rw-p region at 0x600000 is your data section. It's readable and writable, but not executable.
https://stackoverflow.com/questions/19018253/content-of-proc-pid-maps
物理メモリ使用率の確認コマンド
free コマンドで物理メモリの使用率、および内訳を確認できます。
total used free shared buff/cache available Mem: 8063684 358512 7180624 652 524548 7473952
項目 | 説明 |
---|---|
total | システムに搭載されているメモリ |
used | カーネルや各プロセスが利用しているメモリの総量 正確には total - free -buffers - cache |
free | 見かけ上の空き容量 |
buff/cache | カーネル内にあるバッファキャッシュとページキャッシュの総量 |
available | free + カーネル内メモリ領域の開放可能なメモリ |
関連情報
Linux カーネルの機能 | |||
---|---|---|---|
参考サイト
以下のサイトを参考にしました。