【初心者向け】メモリのアーキテクチャ【５分で読める】

# メモリのアーキテクチャ

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

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

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

**場面：オフィスの開発ルーム**
*太郎が `メモリのアーキテクチャ` に関する資料を見ながら、花子に質問する。*

**太郎**：「花子先輩、`メモリのアーキテクチャ` って、 `具体的にどんな仕組みで動いているのか` よく分からなくて…。`ハードウェアとソフトウェアの両面` から教えてもらえませんか？」

**花子**：「なるほどね。`メモリのアーキテクチャ` は、 `ハードウェアの設計` と `OSのメモリ管理` の `2つの視点` から考えると分かりやすいわ。 `ハードウェアとソフトウェアの両面` から説明するわね。」

---

### **メモリのアーキテクチャ**
**花子**：「`メモリのアーキテクチャ` を理解するには、 `3 つの主要なコンセプト` を押さえておくことが大切よ。」

1. **ハードウェアアーキテクチャ**
2. **ソフトウェアアーキテクチャ**
3. **プロセスの仮想アドレス空間**

---

### **1. ハードウェアアーキテクチャ**
**花子**：「まず `ハードウェアアーキテクチャ` について説明するわね。」

#### **(1) メモリの種類**
- **メインメモリ（RAM）** → `一般的に DRAM（Dynamic RAM）が使われる。`
- **キャッシュメモリ** → `CPU 内にある高速メモリ（L1, L2, L3 キャッシュ）。`
- **仮想メモリ** → `物理メモリが不足したときにディスクをメモリの代わりに使う仕組み。`

#### **(2) DDR メモリと帯域幅**
- **DDR（Double Data Rate）** → `DDR4 や DDR5 など、世代ごとに高速化。`
- **マルチチャネルメモリ** → `デュアルチャネル、トリプルチャネル、クアッドチャネルなどの構成。`
- **帯域幅（メモリバスの速度）** → `メモリのデータ転送速度を示す。`

**花子**：「これは `飲食店の厨房` みたいなもので、`調理場（メモリ）が広いほど効率よく料理（データ）を提供できる` のよ。」

**太郎**：「なるほど！ `メモリの帯域幅が広いほど、一度に多くのデータを処理できる` んですね！」

---

### **2. ソフトウェアアーキテクチャ**
**花子**：「`ソフトウェアアーキテクチャ` では、 `OS がどのようにメモリを管理するか` を考えるの。」

#### **(1) 仮想メモリとページング**
- **仮想メモリ** → `各プロセスに対して、広大なアドレス空間を提供する技術。`
- **ページング** → `物理メモリを小さなブロック（ページ）に分割し、管理する方法。`
- **TLB（Translation Lookaside Buffer）** → `仮想アドレスと物理アドレスの対応をキャッシュする仕組み。`

#### **(2) NUMA（Non-Uniform Memory Access）**
- **NUMA アーキテクチャ** → `CPUごとに専用のメモリ領域を持ち、アクセス速度を最適化。`
- **UMA（Uniform Memory Access）** → `すべての CPU が同じメモリにアクセスする方式。`

**花子**：「これは `本社と支店の倉庫の違い` みたいなもので、 `近くの倉庫（メモリ）にアクセスすれば速い` けど、 `遠くの倉庫にアクセスすると遅くなる` のよ。」

**太郎**：「NUMA を理解すれば `マルチプロセッサ環境でのメモリアクセス最適化` ができそうですね！」

---

### **3. プロセスの仮想アドレス空間**
**花子**：「最後に、`プロセスの仮想アドレス空間` について話すわ。」

- **カーネル空間とユーザー空間** → `OS のカーネルが管理する領域と、アプリケーションが使う領域。`
- **スタックとヒープ** → `プログラムの実行中に確保されるメモリ領域。`
- **スワップメモリ** → `物理メモリが不足した際に、ディスクに退避させるメモリ領域。`

**花子**：「これは `スマホのアプリ管理` みたいなもので、 `よく使うアプリはメモリ上に保持` し、 `使わないアプリは一時的にストレージに退避` するのと同じよ。」

**太郎**：「プロセスのメモリ管理も `スワップを適切に使えば、メモリ不足を防げる` んですね！」

---

**花子**：「これらの `メモリのアーキテクチャ` を `図書館の管理` に例えると、こんな感じね。」

1. **ハードウェアアーキテクチャ** → `図書館の本棚の設計`
   - `本棚 = メインメモリ（RAM）`
   - `カウンターに置く数冊 = キャッシュメモリ`
   - `倉庫の予備の本 = 仮想メモリ`

2. **ソフトウェアアーキテクチャ** → `本の貸出管理`
   - `本の貸出カード = TLB（アドレス変換）`
   - `貸し出し中の本 = スワップ`

3. **プロセスの仮想アドレス空間** → `利用者ごとに借りられる本の種類`
   - `一般の読者が読める本 = ユーザー空間`
   - `職員だけが扱える本 = カーネル空間`

**太郎**：「めちゃくちゃ分かりやすいです！ `メモリの管理は、図書館の本の管理とよく似てる` んですね！」

---

**花子**：「`メモリのアーキテクチャ` を理解すると、 `パフォーマンス分析やチューニングの基礎` が分かるわ。」
**太郎**：「ありがとうございます！ `NUMA の影響を調べるために numactl コマンドを試してみます！」 

# 参考リンク

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

- [【初心者向け】システムパフォーマンス関連まとめ【それぞれ５分で読める】](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/)