3秒でわかる
CPU の中で命令を読み解き、他の部品に信号を送る司令塔。プログラムが書いた順に動くのは、この装置がフェッチとデコードを休みなく繰り返しているからです。
もう少し詳しく
どういうものか
制御装置(コントロールユニット)は、CPU を構成する主要なユニットのひとつで、メモリから命令を取り出し、その命令が何をせよと言っているのかを解読し、演算装置やレジスタ、メモリに向けて制御信号を出す部品です。自分では足し算も引き算もしません。誰が何をいつやるかを決めて指示だけを出す立場にあります。
次にどの命令を実行するかはプログラムカウンタ(PC)というレジスタが持っており、制御装置はそのアドレスを見て命令を取りに行きます。取り出したら PC を次の命令へ進め、また取りに行く。この繰り返しが止まるまでがプログラムの実行です。
なぜ必要か
演算装置だけがあっても、いつ足し算をして、その結果をどのレジスタへ書き戻すのかを決める人がいません。制御装置は「命令という文字の並び」を「各部品への電気信号」に翻訳する役をひとりで背負っています。ここがあるおかげで、ハードウェアを組み替えずにソフトウェアを差し替えるだけで別の仕事をさせられます。
具体例
命令サイクルを擬似コードで書くと、制御装置がやっていることは次の形になります。
loop:
命令 = メモリ[PC] # フェッチ 制御装置がアドレスを送って読み出す
PC = PC + 1 # 次の命令へ進める
種類 = デコード(命令) # デコード 何をする命令か解読する
if 種類 == ADD:
ALU へ「加算せよ」の制御信号を送る
elif 種類 == LOAD:
メモリへ「読み出せ」の制御信号を送る
elif 種類 == JUMP:
PC = 命令のアドレス部
goto loop分岐命令で PC を書き換えているのが if 文やループの正体です。
似た用語との違い
| 用語 | 役割 |
|---|---|
| 制御装置 | 命令を解読し、各部品へ指示を出す |
| 演算装置(ALU) | 指示を受けて加減算や比較を実際に計算する |
| レジスタ | CPU 内部の作業机。計算中の値を一時的に置く |
| プログラムカウンタ | 次に読む命令のアドレスを覚えている専用レジスタ |
つまずきやすいところ
制御装置を「計算する部品」と取り違える説明をよく見かけますが、計算は演算装置の仕事です。制御装置は一度も足し算をしません。
もうひとつは、命令サイクルが 1 命令ずつ順番に完了していると思い込む点です。今の CPU はパイプラインを使い、ある命令をデコードしている間に次の命令をフェッチしています。プログラムの結果は順番どおりに見えますが、内部では複数の命令が重なって進んでいます。
覚え方
演算装置が「手」なら制御装置は「頭」です。手は言われたことしかせず、頭は自分では計算しません。