ノイマン型とハーバード型の違い:命令とデータの扱いを比較

ノイマン型のアーキテクチャでは、命令とデータが1つのメモリと1本のバスを共有するので、プロセッサは、命令の取り出しとデータのアクセスを同時にはできません。この制約が、ノイマンボトルネックです。ハーバード型のアーキテクチャでは、命令とデータが別々のメモリにあり、別々のバスを持つので、同時にアクセスできます。現代のほとんどのCPUは、この2つを組み合わせています。メインメモリは共通ですが、L1キャッシュは、命令用とデータ用に分かれています。これを、修正ハーバード型と呼びます。

項目ノイマン型ハーバード型
メモリ1つのメモリに、命令とデータの両方がある命令用とデータ用で、別々のメモリ
バス共有の1本別々のバス
命令の取り出しとデータのアクセス同じバスを取り合う(ノイマンボトルネック)同時にできる
スループット同じバスの速度なら低い高い。並列にアクセスできる
柔軟性高い。プログラムがデータなので、読み込み、生成、変更が簡単低め。コードとデータが分かれている
メモリの割り当てコードとデータの割合を柔軟に変えられるそれぞれのメモリの大きさが固定
ハードウェアの複雑さ単純複雑。2つのメモリと2本のバス
代表的な機器汎用のコンピュータデジタル信号処理プロセッサと、多くのマイコン(AVRやPICなど)
現代のCPUでは共通のメインメモリL1の命令キャッシュとデータキャッシュが分かれている(修正ハーバード型)

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

ノイマン型
汎用のコンピューティングで、プログラムをストレージから読み込み、柔軟性が重要なとき。
ハーバード型
信号処理や組み込み機器など、命令とデータに、予測しやすく高スループットでアクセスしたいとき。

よくある質問

ノイマンボトルネックとは何ですか?

命令とデータが、1つのメモリと1本のバスを共有するので、プロセッサが、命令の取り出しとデータのアクセスを同時にできず、スループットが制限されることです。

現代のCPUはハーバード型を使っていますか?

一部はそうです。メインメモリは共通ですが、L1キャッシュは、命令用とデータ用に分かれています。これを、修正ハーバード型と呼びます。

どのマイコンがハーバード型を使っていますか?

AVRやPICなど、多くのマイコンが、プログラムメモリとデータメモリを別々に持っています。

ハーバード型のマシンで、自己書き換えコードは動きますか?

簡単ではありません。コードとデータが別のメモリにあるからです。この分離が、ノイマン型のほうが柔軟である理由の1つです。

理解度チェック

ノイマン型コンピュータの特徴として正しいものはどれか。

  1. A命令とデータを必ず別々のメモリに置く
  2. Bプログラムを配線の組み替えによって変更する
  3. Cプログラム(命令)とデータを同じ主記憶に格納し、命令を順に読み出して実行する
答えと解説を見る

正解:C. プログラム(命令)とデータを同じ主記憶に格納し、命令を順に読み出して実行する

ノイマン型(プログラム内蔵方式)では、命令とデータを同じ主記憶に置き、CPUが命令を順に読み出して実行します。プログラムをデータとして書き換えられる柔軟さが強みで、現在のコンピュータの基本です。一方、命令とデータが同じ経路を取り合うことが速度の制約になり、これをノイマン・ボトルネックと呼びます。そのため多くのCPUはL1キャッシュを命令用とデータ用に分けています(ハーバード型の考え方)。

キャッシュを命令用(Iキャッシュ)とデータ用(Dキャッシュ)に分けたL1キャッシュの主な利点はどれか。

  1. A命令とデータが同じアドレスに置かれても衝突しなくなり、容量が2倍に見えるから
  2. B命令の取り出しとデータの読み書きを同じクロックで並行して行えるから
  3. C命令は書き換えられないので、Dキャッシュを不要にできるから
答えと解説を見る

正解:B. 命令の取り出しとデータの読み書きを同じクロックで並行して行えるから

パイプラインでは、毎クロック命令を取り出しながら、別の命令がデータを読み書きします。L1を命令用とデータ用に分けると、2つのアクセスが1つのキャッシュのポートを取り合わずに並行して行え、それぞれの性質に合わせた構成も選べます。容量が2倍になるわけではなく、合計の容量を分けて使います。データの読み書きは常に必要なので、Dキャッシュを不要にすることはできません。L2以降は命令とデータを共用するのが一般的です。

CPUが1つの命令を処理する基本的な流れとして正しい順序はどれか。

  1. A実行 → 解読 → 取り出し
  2. B取り出し(フェッチ)→ 解読(デコード)→ 実行
  3. C解読 → 取り出し → 実行
答えと解説を見る

正解:B. 取り出し(フェッチ)→ 解読(デコード)→ 実行

CPUはメモリから命令を取り出し(フェッチ)、内容を解読(デコード)して何をするかを決め、演算などを実行し、必要なら結果をレジスタやメモリに書き戻します。取り出す命令の場所はプログラムカウンタが示し、解読では演算の種類や使うレジスタを判定します。パイプラインはこれらの段階を重ねて並行に進め、毎クロック1命令以上を完了させる仕組みです。

  1. パイプラインで、前の命令の結果を次の命令がすぐ使う(データハザード)とき、レジスタへの書き込みを待たずに演算結果を直接次の命令に渡す手法はどれか。

CPU・アーキテクチャの練習問題へ

関連する用語の解説

ノイマン型アーキテクチャ
プログラムとデータを同じ主記憶に置き、命令を順に読み出して実行するコンピュータの構成。
キャッシュメモリ
CPUの近くに置く高速・小容量のメモリ。よく使うデータを保持して主記憶との速度差を緩和する。主にSRAMでつくられる。

関連する比較