いわゆるノイマン型・プログラム内蔵方式のプロセッサの構造と基本動作は、世界で最初の実用的なノイマン型・プログラム内蔵方式のコンピュータであったEDSACの実装の時点で、すでに構造と基本動作が実装されている。CPUやCPU以外のプロセッサの発達には、プロセス技術の微細化による高速化、命令の各処理工程の並列実行(命令パイプライン、演算パイプライン)、命令の並列実行(スーパースケーラ、VLIW)、データ演算の並列化(SIMD演算)、複数プロセッサ・コアの実装(マルチコア)、複数スレッドの同時実行(同時マルチスレッディング)などやその他多数の要素がある。 CPUは、全体を制御する制御装置、演算装置、データを一時記憶するレジスタ、メモリなどの記憶装置とのインタフェース、周辺機器との入出力装置とのインタフェース、などから構成される。 その他 浮動小数点演算を行うFPU(浮動小数点演算ユニット)、レジスタより多くの情報を一時記憶するキャッシュメモリ、DMAコントローラ、タイマー、シリアルインタフェースなどの機能をCPUと同一IC内に持つものもある。また、メモリから読み込んだ命令語を内部的なオペレーションに置き換える変換部を持つものもある。 クロック同期型のCPUは、クロック信号によって規則正しいタイミングで各部の動作を統制されている。同じアーキテクチャのCPUであればクロック周波数が高い方が高速に動作し、一定時間に多くのことを処理できる。ただしその代わりに消費電力や発熱が大きくなるという問題も発生する。1クロックで処理できる内容はCPUおよび命令セットの設計により異なり、複数クロックで1つの機械語命令を実行するものから、1クロックで複数の命令を同時に実行できるものまである。クロック周波数が1 GHzのCPUは、基本回路が1秒間に10億回の動作をする。 多くのCPUでは、大まかに言って制御装置が命令の解釈とプログラムの制御の流れを制御し、演算装置が演算を実行する。 高性能なCPUや、非ノイマン型のCPUや、画像処理向けのCPUは、同時に複数の命令を実行できるように複数の実行部を同一IC内に持っているものがある。 ノイマン型CPUの基本的な動作は、その実装に関わらずプログラムと呼ばれる命令列を順番に実行することである。 プログラムは数値列として何らかのメモリに格納されている。CPUでは、フェッチ (fetch)、デコード (decode)、実行 (execute) という3つのステップがほぼ必ず存在する。 最初の段階であるフェッチとは、実行すべき命令(ある数値または数値の並び)をプログラムの置かれたメモリから取り出すことである。メモリ上の実行すべき命令の位置はプログラムカウンタで指定される。プログラムカウンタはCPUが現在見ているプログラム上の位置を示しているとも言える。命令フェッチに使用されると、プログラムカウンタはフェッチしたぶんだけ増加させられる。 CPUがメモリからフェッチした命令によってCPUの次にすべきことが決定される。デコードでは、命令をCPUにとって意味のある形式に分割する。命令を表す数値をどう分割するかは、予めそのCPUの命令セットで決定される。命令の一部の数値は命令コードと呼ばれ、実行すべき処理を指定する。その他の部分はオペランドと呼ばれ、その命令で使用する情報を示している。たとえば加算命令のオペランドは加算すべき数値を示している。オペランドには数値そのものが書かれていたり、数値のある場所(メモリのアドレスかレジスタの番号)が書かれている。古い設計では、デコーダ(デコードを行う部分)は変更不可能なハードウェア部品だった。しかし、より複雑で抽象的なCPUや命令セットではマイクロプログラム方式がしばしば使われ、命令を様々な信号に変換するのを助けている。このマイクロプログラムは書き換え可能な場合があり、製造後でも命令デコード方法を変更することができる。 フェッチとデコードの次は、実行ステップが行われる。このステップでは、CPUの多くの部分が接続され(たとえばマルチプレクサを切り替えるなどして)指定された操作を実行する。たとえば、加算を要求されている場合、加算器が所定の入力と接続され、出力と接続される。入力は加算すべき数値を提供し、出力には加算結果が格納される。加算結果が大きすぎてそのCPUに扱えない場合、算術オーバーフローフラグをフラグレジスタ(ステータスレジスタ)にセットする(RISCではフラグレジスタが存在しない場合もある)。入力や出力にはいろいろなものが使用される。演算結果が一時的かあるいはすぐに利用される場合にはレジスタと呼ばれる高速で小さなメモリ領域に格納される。メモリも入力や出力に使われる。レジスタ以外のメモリは低速だが、コスト的には一般的なメモリの方が安価であり大量のデータを格納できるため、コンピュータには必須である。 いくつかの命令はプログラムカウンタを操作する。それらは一般にジャンプ命令と呼ばれ、ループを構成したり、条件分岐をしたり、サブルーチンを実現するのに使われる。また、多くの命令はフラグレジスタを変化させる。それらのフラグはプログラムの動作に影響を与える。たとえば比較命令は二つの値を比較してフラグレジスタにその大小を示す値をセットする。そして、その値を使用してその後の処理の流れを決定する。 命令を実行後、同じ流れが繰り返されて次の命令をプログラムカウンタにしたがってフェッチする。もっと複雑なCPUでは、複数の命令をフェッチし、デコードし、同時に実行することもできる。しかし、基本的にどんなCPUでもやっていることはここで説明した流れと同じである。 現代のCPUのような装置が出てくる以前、ENIACのような計算機は、実行する処理の内容を変えるたびに物理的に配線を変更していた。このような機械では、プログラムを変更するために物理的に再構成する必要がある(たとえばENIACなどではパッチパネルが使われた)ことから「プログラム固定計算機」と呼ばれることがある(なお、ENIACは非常に限られた機能と性能になるが、ある程度はプログラム内蔵方式的な動作もできた)。 CPUは一般にソフトウェア(プログラム)を実行する装置として定義されるため、CPUと呼べる装置が現れたのはプログラム内蔵方式のコンピュータからである。プログラム内蔵方式の考え方は、ENIACの設計時にすでに存在していたが、マシンの完成を早期に可能とするため、ENIACの初期段階で採用されなかった。
構造と動作「コンピュータ#概要」を参照
構造
動作
歴史「コンピュータ#歴史」を参照ENIAC