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

# CPU のアーキテクチャ

理解のために小咄形式でまとめました。長くなってしまったので５分で読めないかも。

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

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

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

**太郎**：「花子先輩、`CPU のアーキテクチャ` って具体的に `何を指す` のか、いまいちピンとこないんです…。」

**花子**：「なるほどね。`CPU アーキテクチャ` とは、 `プロセッサの設計や動作の仕組み` のことよ。 `ハードウェアとソフトウェアの視点` から考えると分かりやすいわ。」

---

## **CPU アーキテクチャ**
**花子**：「`CPU のアーキテクチャ` を理解するには、 `2 つの主要な視点` から考えるといいわ。」

1. **ハードウェアアーキテクチャ**
2. **ソフトウェアアーキテクチャ**

---

### **1. ハードウェアアーキテクチャ**
**花子**：「`ハードウェアアーキテクチャ` とは、 `CPU の物理的な構造やコンポーネントの配置` のことよ。」

#### **CPU コアとキャッシュ**
- **CPU は 1 つ以上のコアを持つ**（例: デュアルコア、クアッドコア、オクタコア）
- **各コアは L1, L2, L3 のキャッシュを持つ**
- **L1 は最速だが小さい、L3 は遅いが大容量**

**花子**：「CPU のキャッシュとメモリの構造は、 レストランのキッチンの食材管理 にそっくりなの。」

- **L1 キャッシュ（最速・小容量）** → シェフの手元にある調味料（塩・胡椒・オイル）
    すぐ使えるけど容量が少ない。シェフは頻繁に使うものだけを置いて、調理の効率を最大化する。

- **L2 キャッシュ（やや遅い・中容量）** → キッチンの棚や冷蔵庫の食材（肉・野菜・牛乳）
    少し時間がかかるけど、すぐに取り出せる。手元の調味料が足りなくなったら、すぐ補充できるように準備されている。

- **L3 キャッシュ（最も遅いが大容量）** → 店の裏にあるストック倉庫
    たくさん保管できるが、取りに行くのに時間がかかる。キッチンで足りなくなったら、スタッフが倉庫に行って補充する。

**花子**：「このように、 よく使うデータ（食材）は手元に、たまに使うものは少し遠くに、大量に保管するものは倉庫に という構造は、 CPU のキャッシュとメモリの階層構造と全く同じ考え方 なのよ。」

---

#### **CPU のバスとインターコネクト**
- **CPU 内部では、データをやり取りするための `バス` がある**
- **コア同士は `インターコネクト（リングバス、メッシュ）` で通信**
- **データの流れが詰まると `スループット低下` の原因になる**

**花子**：「これは `道路のネットワーク` みたいなもので、 `渋滞（ボトルネック）` が発生すると `データの流れが悪くなる` のと同じね。」

##### **CPU のバスとは？**
###### **高速道路と一般道路のネットワーク**
**花子**：「CPU 内部のバスは、**データをやり取りするための道路のようなもの** なのよ。」

- **メインバス（フロントサイドバス）** → `高速道路`
  - **CPU とメモリの間をつなぐ最重要ルート**。
  - 交通量（データ転送量）が多いので、**十分な車線（帯域幅）が必要**。

- **内部バス（データバス、アドレスバス）** → `一般道路`
  - 各町（CPU のコアやメモリ）をつなぐローカルな道。
  - 一般道路の数が少ないと、**データの流れが詰まりやすくなる**。

**花子**：「CPU のバスが **広い道路（帯域幅が広い）** なら、**大量の車（データ）をスムーズに運べる** わ。でも、道路が狭いと、**渋滞（データ詰まり）が発生し、スループットが低下する** のよ。」

---

#### **コア同士のインターコネクト**
**花子**：「CPU のコア同士は、**データをやり取りするための `インターコネクト`** で通信しているのよ。」

##### **環状線（リングバス）とメッシュ型道路**
- **リングバス（環状線）**  
  - 大都市の環状道路（例: 東京の首都高速環状線、大阪の阪神高速環状線）に似ている。
  - **データは時計回りまたは反時計回りに流れる**。
  - **ある地点が詰まると、その後のすべての車（データ）に影響が出る**。
  - **メリット**：設計がシンプルでコストが低い。
  - **デメリット**：混雑時にデータの流れが遅くなる（レイテンシ増加）。

**花子**：「**片側1車線の環状線** だと、**事故や渋滞が発生すると、後ろの車が進めなくなる（ボトルネック）** わ。**片側3車線の環状線** なら、**渋滞を回避しやすく、スムーズに流れる（帯域幅が広い）** のよ。」

- **メッシュ型インターコネクト（都市部の道路網）**  
  - **東京やニューヨークのような碁盤目状の道路ネットワーク** に似ている。
  - 各コア（街）が **複数のルートを通じて接続されている**。
  - どこかの道が渋滞しても、**別の道を通れば回避できる**（耐障害性が高い）。
  - **メリット**：通信遅延が少なく、スループットが高い。
  - **デメリット**：設計が複雑でコストが高い。

**花子**：「リングバス（環状線）は、環状道路で一方通行に流れる道よ。メッシュ型（都市部の道路網）は複数の道があり、最適なルートを選べるわ。**メッシュ型のほうが一般的に効率が良い** のよ。」

---

#### **バスの詰まりとスループットの低下**
##### **通勤ラッシュと渋滞**
🚗 **現実のイメージ**
- 朝の通勤ラッシュ時、電車やバスが混雑すると、**駅や道路が詰まり、移動速度が落ちる**。
- CPU でも **バスの帯域幅が狭いと、データが渋滞して処理が遅くなる**。

💡 **解決策**
- **バスの帯域幅を広げる（高速道路の拡張）** → より多くのデータを同時に流せる。
- **別のルートを用意する（複数の鉄道路線を作る）** → データの流れを分散し、混雑を避ける。

---

#### **高性能 CPU での対策**
##### **データセンターの通信ネットワーク**
データセンターでは、**多数のサーバー（コア）が大量のデータをやり取りする**。

- **シンプルなネットワーク（リングバス）**
  - **小規模なデータセンターでは効率的**。
  - しかし、大量のリクエストが来ると **ボトルネックが発生しやすい**。

- **メッシュ型ネットワーク**
  - **大規模なデータセンターは、高速通信のためにメッシュ型を採用**。
  - **トラフィックが分散され、処理速度が向上**。

**花子**：「**リングバスは小規模向け、メッシュ型は大規模向け** なのよ。」

---

**太郎**：「つまり、CPU のバスは `道路のネットワーク` みたいなもので、 **リングバスは環状線、メッシュ型は都市部の碁盤目状の道路** ってことですね！」

**花子**：「その通りよ。だから、**CPU の設計では、ボトルネックを避けるために適切なバス構成を選ぶことが大事** なの。」

---

### **マルチプロセッサと NUMA**
- **マルチプロセッサ（SMP）** → `複数の CPU が対等に動作`
- **NUMA（非均一メモリアクセス）** → `CPU に近いメモリが速い、遠いと遅い`
- **NUMA は特に `サーバーやデータセンター` で重要**

**花子**：「これは `複数のキッチンを持つレストラン` みたいなもので、 `近くの食材（メモリ）を使うと速い` けど、 `遠い場所にあると時間がかかる` のよ。」

#### **マルチプロセッサ（SMP）**
##### **複数のシェフがいるレストラン**
**花子**：「マルチプロセッサ（SMP）は、**複数の CPU が対等に動作し、並行して処理を行う仕組み** なの。これは **複数のシェフがいるレストランのキッチン** に例えられるわ。」

- **シングルプロセッサ（1人のシェフ）**
  - シェフが **1人で料理をすべて作る**。
  - 1つの料理を作り終えるまで、次の料理に手をつけられない。
  - **混雑時に注文がたまると、処理速度が落ちる**。

- **マルチプロセッサ（複数のシェフ）**
  - **複数のシェフが並行して料理を作る**。
  - 1人がメインディッシュ、1人がサイドメニュー、1人がデザートを担当すると、**全体の調理速度が向上**。
  - 各シェフが **独立して働くが、同じキッチン（共有メモリ）を利用** するため、効率的に作業できる。

**花子**：「このように、 **CPU が増えると、並行処理能力が向上し、全体の処理速度が上がる** のよ。」

---

##### **大規模なコールセンター**
**花子**：コールセンターも **マルチプロセッサの仕組み** に似ているわ。」

- **シングルプロセッサ（1人のオペレーター）**
  - **1人のオペレーターが全ての電話を対応する**。
  - 1つの電話を処理している間、他の電話は待たなければならない。

- **マルチプロセッサ（複数のオペレーター）**
  - **複数のオペレーターが並行して対応** することで、**待ち時間を減らし、全体の処理能力が向上**。
  - それぞれが **同じ顧客データベース（共有メモリ）を参照しながら対応する**。

**花子**：「こうすることで、**一度に多くの問い合わせを処理できるようになる** のね。」

---

#### **NUMA（非均一メモリアクセス）**
##### **複数のキッチンを持つレストラン**
**花子**：NUMA（Non-Uniform Memory Access）は、**CPU に近いメモリほどアクセスが速く、遠いメモリにアクセスすると遅くなる** という仕組みよ。これは **複数のキッチンを持つレストラン** に例えられるの。」

###### **理想的な環境（SMPに近い）**
- それぞれのシェフが **自分のキッチン（メモリ）で料理を作る**。
- 材料が **すぐ手の届く範囲** にあるため、**最速で調理** できる。

###### **NUMA環境（大規模レストラン）**
- あるキッチンで材料が足りなくなると、**別のキッチン（遠くのメモリ）から取り寄せる必要がある**。
- 近くにある材料ならすぐに使えるが、遠くの倉庫から取りに行くと時間がかかる。
- そのため、各キッチンは **できるだけ自分のエリアの食材を使うほうが効率がいい**。

**花子**：「これが NUMA の基本概念で、CPU が自分に近いメモリを使うと速く、遠くのメモリにアクセスすると遅くなるという仕組みなの。」

---

##### **分散オフィスのプリンター利用**
**花子**：「NUMA の概念は、**会社のプリンター利用** にも似ているわ。」

###### **SMP（均一メモリアクセス）の場合**
- オフィスのどこにいても、**すべての人が同じ速度でプリンターを使える**。

###### **NUMA（非均一メモリアクセス）の場合**
- 各部署ごとに **専用のプリンター（ローカルメモリ）** を持っている。
- **自分の部署のプリンターを使う方が速い**（CPU が近いメモリを使う）。
- しかし、別の部署のプリンターを使うと、**ネットワークを経由するため印刷に時間がかかる**（遠いメモリにアクセスすると遅くなる）。

**花子**：「このように、NUMA 環境では **できるだけ近くのリソースを利用することが重要** なのよ。」

---

##### **シェアオフィスのコーヒーマシン**
**花子**：「大きなシェアオフィスに、**各フロアごとにコーヒーマシンが設置** されていると考えてみて。」

- **各フロアの人が自分のフロアのコーヒーマシンを使う（最適なNUMA環境）**  
  - すぐにコーヒーを入れられる（メモリアクセスが速い）。  

- **違うフロアのコーヒーマシンを使う（NUMAの遅延）**  
  - 他のフロアまで行く必要があり、時間がかかる（メモリアクセスが遅い）。  

**花子**：「CPU も近くのメモリを使うほど高速で、遠くのメモリにアクセスすると遅くなるのよ。」

---

**太郎**：「なるほど！マルチプロセッサ（SMP）は **複数のシェフが並行して料理を作る仕組み** で、NUMA は **遠くの食材を取りに行くと遅くなるレストランみたいなもの** なんですね！」

**花子**：「そうよ。だから、NUMA のシステムでは、**できるだけ近くのメモリを活用するように設計することが重要** なの。」

---

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

#### **CISC vs RISC**
- **CISC（Complex Instruction Set Computer）**
  - `複雑な命令を 1 つで処理できる`
  - `x86（Intel, AMD）が代表例`
- **RISC（Reduced Instruction Set Computer）**
  - `シンプルな命令を高速に実行`
  - `ARM（スマホ、組み込み機器）、RISC-V などが代表例`

**花子**：「これは `オートマ車（CISC）` と `マニュアル車（RISC）` の違いみたいなもので、 `CISC は一つの操作で多くを処理` し、 `RISC はシンプルな操作を素早く繰り返す` のよ。」

---

#### **仮想化とコンテナ**
- **仮想 CPU（vCPU）** → `仮想マシン（VM）内でエミュレーションされる CPU`
- **コンテナ** → `OS レベルの仮想化で、CPU リソースを分割`

**花子**：「これは `シェアオフィス` みたいなもので、 `仮想マシンは完全に独立したオフィス`、 `コンテナは仕切りがあるだけのデスクスペース` なのよ。」

---

#### **命令セットとシステムコール**
- **CPU は `決められた命令セット` に従って動作**
- **アプリケーションが OS にリクエストを出すと `システムコール` を通じて CPU が動作**
- **例: `read(), write(), fork(), exec()` など**

**花子**：「これは `レストランの注文システム` みたいなもので、 `お客さん（アプリ）が店員（OS）に注文し、シェフ（CPU）が料理を作る` のと同じね。」

---

**花子**：「`CPU のアーキテクチャ` を `高速道路のネットワーク` に例えると、こんな感じね。」

1. **ハードウェアアーキテクチャ** → `道路の設計`
   - `コア = 走行車線`
   - `キャッシュ = 近場の駐車場`
   - `バスとインターコネクト = 高速道路`

2. **ソフトウェアアーキテクチャ** → `交通ルール`
   - `RISC = シンプルな標識でスムーズに進む`
   - `CISC = 複雑な信号制御で高度な動きができる`
   - `システムコール = 交通整理員（OS）が指示を出す`

**太郎**：「すごく分かりやすいです！ `ハードウェアとソフトウェアの両方の観点` で CPU のアーキテクチャを考えるのが重要なんですね！」

---

**花子**：「`CPU のアーキテクチャ` を理解すると、 `プロセッサの設計やパフォーマンスの最適化` に役立つわ。」

**太郎**：「ありがとうございます！ `NUMA の影響を調べるために lscpu コマンドで CPU アーキテクチャを確認` してみます！」 

# 参考リンク

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

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