とある科学の備忘録

とある科学の備忘録

CやPythonのプログラミング、Arduino等を使った電子工作をメインに書いています。また、木製CNCやドローンの自作製作記も更新中です。たまに機械学習とかもやってます。

【パソコン】CPUの動作原理

コンピュータの心臓部の部品、CPUとは何なのか?
CPUはどのように動作しているのか?

この記事では、CPUの動作についてみていきます。

 

1.CPUについて

f:id:pythonjacascript:20181124132215j:plain
Wikipediaより引用)

CPUは、数あるパソコンを構成する部品の中の1つで、データの演算処理を行います。
CPU(central processing unit)の中にはデータ処理をしたり様々な命令を実行するのに必要な回路がすべて備わっています。CPUの中には大量の半導体が超高密度で詰め込まれており、高速でデータ処理ができるようにナノ単位で設計されています。


CPUの動作原理

CPUはおおざっぱに書くと、このような内部構造をしています。
f:id:pythonjacascript:20181124144221j:plain

CPUの中には、主にALUや命令レジスタデコーダなどがあり、それぞれが以下のような個別の役割を持っています。

レジスタ

モリーから取得したデータや、ALUでの計算結果を一時的に保存するための記憶媒体です。メモリーよりも高速でデータのやり取りを行うことができます。
レジスタには、動作命令を格納している命令レジスタ(IR、Instruction Resister)や、プログラムカウンター(Program Counter 、PC)等があります。

命令レジスタ

CPUは大量の命令を高速で一つずつ実行しています。その時、各命令は実行する前に「デコード」という処理がなされます。(デコードについては「デコーダ」で解説)
命令レジスタは、各命令を実行するときにそれを命令レジスタに格納し、デコードして実行するまでの間保持し続けます。

プログラムカウンタ

それぞれのデータを格納する場所があるのと同じように、プログラムもコードとして格納されています。
そして、命令(プログラム)を実行するには、その命令が格納されているアドレスを知らなければなりません。

そこで、プログラムカウンタは、次に実行する命令のアドレスを保存しています。
よって、プログラムカウンタの値は、命令がひとつ実行されるごとに+1(命令長が2の場合は+2)されます。
また、割込み命令などの場合は飛び越し先のアドレスが格納されます。ジャンプ命令は、このプログラムカウンタの値を任意のアドレスに書き換えることで、命令をスキップ(ジャンプ)して特定の命令から実行することができるのです。

ALU

ALUは、実際に計算を実行する部分です。
ALUは、2つのデータを加算、減算、シフト演算、AND、ORなどの論理演算することができます。そのため、ALUの中にはそれらの計算を行うための物理的なロジック回路が実装されています。
f:id:pythonjacascript:20181124151037j:plain

まず、ALUには2つの今から計算処理する数値データが入力されます。この時入力された二つのデータをオペランドと呼びます。
次に、デコーダから入力されたオペコード(OPCODE)命令(どの演算を実行するかを表す命令)が入力されます。ALUは2つのオペランドを足したり、一方から他方を引いたり、ANDやOR、XORなどの論理演算をできるのですが、それらの処理のうちどの計算を行うかがOPCODEによって指定されます。
そして、オペコードの命令に基づいて、ALUの中の論理回路によって計算します。計算結果はアキュムレータ(Accumulator)に出力されます。


アキュムレーター

ALUでの演算結果は、アキュムレーターというレジスタに渡されます。
アキュムレーターは、ALUの演算結果を累積し、総和を得るときに使うレジスタのことです。
ですが、総和を得る必要がない場合は、演算結果はメモリの適切な場所に保存されることになります。


デコーダ

次に実行しなければならない命令は、命令レジスタに格納されています。そして、その命令をALUで実行するために行わなければならない作業が「デコード」で、デコードを行うのがデコーダです。

命令レジスタに格納された命令は、0と1の羅列である機械語で書かれています。それをデコードすることによって、命令を解釈することができるのです。具体的には、ALUでデータ同士を足し合すのか、引くのか etc. を、命令から読み取ります。このデコード作業によって解釈された命令は、ALUの OPCODEに入力され、ALUの計算処理をコントロールします。



プログラム内蔵方式

この記事での「命令」とは、CPUにどのような動作をさせるのか、またデータをどのように処理させるのかを表しています。命令は、プログラムによって大量に生成されて、CPUなどの処理デバイスは、それらの命令を順番に*1処理していきます。

このような命令も、実はデータと同じように、メモリーに格納されて、それぞれの命令ごとにアドレスを持っています。そして、CPUは、データを取り出すのと同じようにしてメモリーから命令を読み込み、それを実行しているのです。メモリー上の命令をバスを通して命令レジスタに読み込む動作を「フェッチ(Fetch)」と言います。このように、プログラムをメモリーに保存してデータと同じように扱う手法のことをプログラム内蔵方式(Stored Program Concept)と言います。

まとめ

このように、CPUは次の動作を繰り返しながら命令を実行しています。

  1. プログラムカウンタの値をもとに命令をフェッチする(メモリーから命令を読み込む)
  2. 命令をデコードする(命令を解釈)
  3. ALUに2つのオペランドを入力し
  4. デコード結果のオペコードに基づいて、計算実行。
  5. プログラムカウンタを+1または+2する。

このような一連の動作のことを命令サイクル(the fetch-decode-execute cycle)と呼ばれることもあります。

*1:割り込みや、ジャンプ命令を除く