フォン・ノイマンアーキテクチャ

Elementry
最終更新: タグ: Concept

パーツには計画が必要

コンピューターのパーツ では CPU、RAM、ストレージ、I/O デバイスを紹介した。各部品が単体で何をするかは知っている。でも部品を知ることは、それらが一緒に動いてプログラムを実際に動かす仕組みを理解することとは違う。

考えてみると、コンピューターには毎秒数十億の計算ができる CPU と、プログラムで満たされたストレージドライブがある。CPU はどのプログラムを動かすべきかをどうやって知るのか?次の命令がどこにあるかをどうやって知るのか?誰が指揮しているのか?

その答えがフォン・ノイマンアーキテクチャ(Von Neumann Architecture)だ — 1940年代後半以降に作られた事実上すべてのコンピューターが従ってきた設計モデルで、最初の部屋大のマシンからポケットのスマートフォンまで。

名前の由来となった人物

このアーキテクチャはジョン・フォン・ノイマン(John von Neumann)という数学者の名前を冠している。1940年代に最初期のコンピュータープロジェクトに関わった人物だ。コンピューターをどう設計すべきかを記述した報告書の作成に貢献した — 特定の一つの仕事のために配線されたハードウェアではなく、与えたあらゆるプログラムを動かせる柔軟な機械。

その報告書が今も使っているモデルを記述した。

大きなアイデア:プログラムはただのデータ

フォン・ノイマンの業績以前、多くの計算機は特定の一つのタスクを実行するよう物理的に配線されていた。別のことをさせたければ、機械を再配線する必要があった — 文字通りケーブルとスイッチを並べ替える。一つの目的には速かったが、まったく柔軟性がなかった。

フォン・ノイマンの重要な洞察はこうだ:プログラムはただのデータ。命令はただの数値 — CPU に何をすべきかを伝える数値だ。そしてメモリは数値を保持できるため、メモリはプログラムを保持できる。プログラムを処理するデータと並べてメモリに保存すれば、同じハードウェアが異なるプログラムを読み込むだけで全く別のことができる。

このアイデアを格納プログラム方式(stored-program concept)と呼ぶ。これはコンピューティングの歴史で最も重要なアイデアだ。

実際に何を意味するかというと、ゲームをダウンロードするとき、大きな数列をストレージドライブに書き込んでいる。起動すると、その数値が RAM にコピーされ、CPU はそれらを読んで実行し始める。CPU は変わっていない。RAM も変わっていない。変わったのはメモリの内容だけだ。だから一つのデバイスがゲームコンソール、表計算エディター、動画プレイヤーになれる — すべて同じハードウェアで。

フォン・ノイマンモデルの四つの部品

フォン・ノイマンアーキテクチャは四つの主要コンポーネントを定義する。すでに会ったことがある — 今度は正式なモデルとしてどう位置付けられるかを見ていこう。

メモリ

フォン・ノイマンモデルでは、メモリは二つのものを同時に保持する:

  • プログラム命令 — CPU が従うべき手順のリスト
  • データ — プログラムが処理している値(数値、テキスト、ゲームの状態など)

どちらも同じ RAM に存在し、どちらとして使われるかによってのみ区別される。格納プログラム方式が実際に働いている姿だ。

メモリ内の各場所にはアドレス(address)がある — CPU が「4,200番地に保存されているものを取ってくれ」と指定するための固有の番号だ。メモリは長い番号付きのメールボックスの列として考えると分かりやすい。各メールボックスは一片の情報を保持する。CPU はメールボックスの番号を指定して読み書きする。

CPU

フォン・ノイマンモデルでは、CPU は主に二つのサブパーツに分かれる:

  • 制御装置(CU)(Control Unit)— プロセス全体を動かす部品。メモリから命令を読み、その意味を解釈し、他のすべてに何をすべきかを伝える。
  • 算術論理演算装置(ALU)(Arithmetic Logic Unit)— 実際の計算と比較をする部品 — 加算、減算、「この数値はあの数値より大きいか?」など。

CPU にはまた、レジスタ(register)と呼ばれる少数の超高速な記憶スロットがある。RAM ではなく — チップ自体に直接組み込まれているため、主メモリよりはるかに高速にアクセスできる。CPU はレジスタを即座のメモ帳として使う — 「あれを処理する間、この数値を持っておく」。

一つのレジスタが特に重要だ:プログラムカウンター(PC)(Program Counter)。次に実行する命令のアドレスを保存する。各命令が終わると、プログラムカウンターは自動的に前進して、CPU が次にどこを見ればよいかを知る。

入出力

学んだ I/O デバイス — キーボード、画面、ストレージドライブ、マウス — は、コンピューターが世界からデータを受け取って結果を出す方法だ。フォン・ノイマンモデルでは、CPU とメモリを繋ぐ同じ通信経路に接続される。

バス

モデルのすべてはバス(bus)と呼ばれる共有経路で通信する。CPU がメモリから命令を読みたければ、バスにアドレスを送ってそれが戻ってくるのを待つ。ALU が計算を終えてメモリに結果を保存する必要があれば、その結果はバスを通って目的地に移動する。

バスは高速道路であり、CPU、メモリ、I/O デバイスはそれに繋がれた都市だ。

フェッチ・デコード・実行サイクル

ここですべてがはっきり繋がる。フォン・ノイマンアーキテクチャはコンポーネントが何であるかだけでなく、フェッチ・デコード・実行サイクル(fetch-decode-execute cycle、命令サイクルとも呼ぶ)という連続したループでどう一緒に動くかも記述する。

一歩ずつ見ていこう。

ステップ 1:フェッチ

制御装置はプログラムカウンターを見て次の命令のアドレスを見つける。そのアドレスをバスでメモリに送り、命令が返ってくる。命令は CPU 内のレジスタに置かれる。

「4,200番地から次の命令をフェッチする。」

ステップ 2:デコード

制御装置は取ってきた命令を調べる。命令は数値としてエンコードされているため、制御装置はデコードする — 「ああ、これはレジスタ A の数値にレジスタ B の数値を加算することを意味する。」

「この命令は:レジスタ A とレジスタ B を加算することを意味する。」

ステップ 3:実行

制御装置は CPU の適切な部品に命令を実行するよう伝える。この例では、ALU が加算を実行してレジスタに結果を書き込む。

実行後、プログラムカウンターが自動的に更新されて次の命令を指し、サイクルがすぐに再び始まる。

「加算する。完了。次の命令へ。」

そして CPU はこれをまた行う。また。また — 毎秒数十億回。

これまで動かしてきたすべてのプログラム — すべてのゲーム、すべてのウェブサイト、バックグラウンドで流れるすべての曲 — このループが繰り返され、プログラムが終わる(または閉じる)まで実行されてきた。

最初から最後まで一例を見る

二つの数値を加算して結果を表示するだけのプログラムを想像してほしい。本質に絞ると、フェッチ・デコード・実行サイクルは次のように処理する:

  1. フェッチ:命令「5 をレジスタ A に読み込む」。

  2. デコード:「レジスタ A に 5 を入れる」を意味する。

  3. 実行:レジスタ A が 5 を保持。プログラムカウンターが進む。

  4. フェッチ:命令「3 をレジスタ B に読み込む」。

  5. デコード:「レジスタ B に 3 を入れる」を意味する。

  6. 実行:レジスタ B が 3 を保持。プログラムカウンターが進む。

  7. フェッチ:命令「レジスタ A とレジスタ B を加算し、結果をレジスタ C に保存する」。

  8. デコード:「ALU:A + B を計算して答えを C に入れる」を意味する。

  9. 実行:ALU が 5 + 3 = 8 を計算してレジスタ C に 8 を入れる。プログラムカウンターが進む。

  10. フェッチ:命令「レジスタ C を画面に送る」。

  11. デコード:「C の値をディスプレイとして出力する」を意味する。

  12. 実行:8 が画面に表示される。

それだけだ。三つのステップを四回繰り返す。一つの完全なプログラム — 同じサイクルが自動的に一命令ずつ実行した。

設計の代償:フォン・ノイマンボトルネック

フォン・ノイマンアーキテクチャには一つの注目すべき弱点がある。命令とデータの両方が同じメモリに存在して同じバスを移動するため、CPU は一度に一つのことしか取ってこれない。命令と何らかのデータが同時に必要な場合、どちらかが待たなければならない。

この制限 — バスが渋滞点になること — をフォン・ノイマンボトルネック(Von Neumann bottleneck)と呼ぶ。CPU が何十年もかけて速くなるにつれて、これはますます顕著になった — CPU がメモリがそれを届けられるよりはるかに速く命令を実行できるようになった。

現代の CPU はこれを回避するいくつかのトリックを使う。最も重要なのは、CPU チップに直接組み込まれた小さくて極めて高速なメモリバンク — キャッシュ(cache)だ。キャッシュは最近使った命令とデータのコピーを保存するため、CPU は RAM まで旅をしなくても取り出せる。

キャッシュの動き方をまだ詳しく知る必要はない。重要なのは、今日のハードウェアでもフォン・ノイマンモデルが根本的な設計を形作り続けているということだ — エンジニアはその上に巧妙な最適化の層を積み重ねているだけだ。

まとめ

  • フォン・ノイマンアーキテクチャは事実上これまで作られたすべてのコンピューターが従う設計モデルだ。1940年代に記述され、現代のコンピューティングの基盤であり続けている。
  • 格納プログラム方式(stored-program concept)がその中心的な洞察だ — プログラムはメモリに保存されたただのデータ。別のプログラムを読み込むと、同じハードウェアが全く別のことをする。
  • モデルには四つのコンポーネントがある:
    • メモリ — プログラム命令と処理するデータの両方を番号付きアドレスに保持する。
    • CPU — 命令を実行する。プロセスを動かす制御装置(CU)と計算をするALUに分かれる。
    • I/O デバイス — コンピューターと外界を繋ぐ。
    • バス — コンポーネント間でデータが移動する共有経路。
  • CPU の中で、小さなレジスタが超高速のメモ帳として機能する。プログラムカウンターレジスタは常に次の命令のアドレスを保持する。
  • CPU は連続したフェッチ・デコード・実行サイクルで動く — メモリから次の命令をフェッチし、それが何を意味するかデコードし、実行し、繰り返す — 毎秒数十億回。
  • フォン・ノイマンボトルネックが欠点だ — 一つの共有バスは命令とデータが同時に移動できないことを意味する。現代の CPU はチップに組み込まれたキャッシュメモリでその影響を減らしている。