【初心者向け】メモリの基本概念（コンセプト）【５分で読める】

# メモリの基本概念（コンセプト）

理解のために小咄形式でまとめました。

:::note info
システムパフォーマンス関連記事の目次
- [【初心者向け】システムパフォーマンス関連まとめ【それぞれ５分で読める】](https://qiita.com/nouernet/items/d3efe67e0f52a92e061d)
:::

**登場人物**
- **太郎（後輩）**：入社1年目の若手エンジニア。
- **花子（先輩）**：システムエンジニア歴3年の先輩。

**場面：社内の開発ルーム**
*太郎が `メモリの管理とパフォーマンス` に関する資料を見ながら、花子に質問する。*

**太郎**：「花子先輩、`メモリの基本概念（コンセプト）` について理解したいです！ `仮想メモリとかスワッピングとか、聞いたことはあるけど実際どういう仕組みなのか分かりません…。`」

**花子**：「いい質問ね！ `メモリ管理の概念` を理解することは、 `システムのパフォーマンスを最適化する` 上でとても重要よ。 `7 つの重要なコンセプト` を説明するわね。」

---

### **メモリの基本概念（コンセプト）**
**花子**：「`メモリ管理の基本` を理解するために、 `7 つの主要な概念` を押さえておきましょう。」

1. **仮想メモリ**
2. **ページング**
3. **デマンドページング**
4. **オーバーコミット**
5. **プロセスのスワッピング**
6. **ファイルシステムキャッシュの使い方**
7. **ワーキングセットサイズ**

---

### **1. 仮想メモリ**
**花子**：「`仮想メモリ` は、 `プロセスごとに独立したメモリ空間を提供する仕組み` よ。」

- **各プロセスは `独立したメモリアドレス空間` を持つ**
- **物理メモリが不足しても `ディスクの一部を仮想メモリとして使用` できる**
- **カーネルが `仮想アドレスを物理メモリにマッピング` することで実現される**

**花子**：「これは `オフィスの個人デスク` みたいなもので、 `一見すると広々と使えているけど、実際には共有のストレージを使っている` のと同じね。」

**太郎**：「なるほど、 `仮想メモリがあるから、アプリケーションは他のプロセスと独立したメモリ空間を持てる` んですね！」

---

### **2. ページング**
**花子**：「`ページング` は、 `仮想メモリを小さな単位（ページ）に分割し、物理メモリに割り当てる仕組み` よ。」

- **メモリは `固定サイズ（例: 4KB）のページ単位` で管理される**
- **CPU は `ページテーブル` を使って `仮想アドレスを物理アドレスに変換` する**
- **不要になったページは `ディスクに退避（ページアウト）` し、必要に応じて `再読み込み（ページイン）` される**

**花子**：「これは `本棚の整理` みたいなもので、 `よく使う本（ページ）はすぐ取れる場所に置き、使わない本は別の倉庫（ディスク）にしまう` のと同じね。」

**太郎**：「ってことは、 `ページングがうまく機能しないと、頻繁にディスクアクセスが発生してパフォーマンスが落ちる` んですね！」

---

### **3. デマンドページング**
**花子**：「`デマンドページング` は、 `必要になったときにページをメモリへロードする方式` よ。」

- **最初に `すべてのメモリをロードせず、必要になったページだけをロード`**
- **プログラム起動時の `メモリ使用量を抑え、起動時間を短縮` できる**
- **ただし、`ページフォールト（メモリにないページへアクセスすること）` が頻発すると遅くなる**

**花子**：「これは `料理の材料を全部用意せず、必要になったら取りに行く` のと同じね。ただし、`頻繁に倉庫（ディスク）に行くと時間がかかる` のよ。」

**太郎**：「なるほど！ `デマンドページングが効率的に動作すれば、無駄なメモリ使用を減らせる` んですね！」

---

### **4. オーバーコミット**
**花子**：「`オーバーコミット` は、 `システムが実際の物理メモリよりも多くのメモリを割り当てられる仕組み` よ。」

- **プロセスが `実際に使わないメモリのアロケーションを許可`**
- **仮想メモリを `多めに割り当てることで、リソースを柔軟に使える`**
- **しかし、 `メモリ不足になると OOM キラー（Out of Memory Killer）がプロセスを強制終了` することがある**

**花子**：「これは `飛行機のオーバーブッキング` みたいなもので、 `予約（メモリ確保）はできるけど、実際に全員来ると席（メモリ）が足りなくなる` のと同じね。」

**太郎**：「じゃあ、 `オーバーコミットを使いすぎると、急にプロセスが落ちる危険がある` んですね！」

---

### **5. プロセスのスワッピング**
**花子**：「`スワッピング` は、 `メモリ不足時にプロセス全体をディスクへ移動する仕組み` よ。」

- **スワップ領域に `プロセスのメモリを保存` し、一時的に物理メモリを開放**
- **ただし、`スワップイン・アウトが頻発すると、システムの速度が大幅に低下（スラッシング）` する**
- **`スワップが発生していないか確認するには、vmstat コマンドを使用`**

**花子**：「これは `混雑したカフェで席を譲る` みたいなもので、 `一度席を立って戻ると、注文からやり直しになる` のと同じよ。」

**太郎**：「だから `スワッピングが多発するとシステムが遅くなる` んですね！」

---

**花子**：「これらの `メモリ管理の仕組み` を `オフィスの書類管理` に例えると、こんな感じね。」

1. **仮想メモリ** → `各社員が個別のデスク（仮想メモリ）を持つが、実際には共通の書類棚（物理メモリ）を使う`
2. **ページング** → `よく使う資料はデスク上に置き、あまり使わない資料は倉庫に保管する`
3. **デマンドページング** → `必要になった資料だけ取り出し、普段はしまっておく`
4. **オーバーコミット** → `社内の会議室予約が、実際の会議室数を超えてしまう`
5. **スワッピング** → `忙しいときに社員を一時的に別の部屋に移動させ、必要になったら戻ってきてもらう`

**太郎**：「めちゃくちゃ分かりやすいです！ `メモリ管理を理解すれば、パフォーマンスチューニングにも役立ちそう` ですね！」

# 参考リンク

システムパフォーマンス関連記事の目次

- [【初心者向け】システムパフォーマンス関連まとめ【それぞれ５分で読める】](https://qiita.com/nouernet/items/d3efe67e0f52a92e061d)

システムパフォーマンス関連記事は、以下の書籍を参考に記述しています。

- [［改訂新版］プロのためのLinuxシステム構築・運用技術](https://www.amazon.co.jp/dp/B01LZURAPK)
- [改訂2版 ネットワークエンジニアの教科書](https://www.amazon.co.jp/dp/B07NXQ4TDV)
- [絵で見てわかるシステムパフォーマンスの仕組み](https://www.amazon.co.jp/dp/B00LHFOTF4)
- [詳解 システム・パフォーマンス 第2版](https://www.oreilly.co.jp/books/9784814400072/)
- [入門 モダンLinux](https://www.oreilly.co.jp/books/9784814400218/)
- [Linuxシステム管理](https://www.oreilly.co.jp/books/9784873113463/)