CPUて結局何しているのか調べてみた件

どうも初めまして！　

最近基本情報技術者の資格取得に向けて勉強中な駆け出しエンジニアのワカです。

#■この記事を書こうと思ったきっかけ
最近書籍を購入して勉強しているのですが、暗記ばかりでなかなか身にならないと思いました。

そこで基本情報に書かれている内容を自分なりに解釈したものをここに備忘録として書き残すことにしました。
そうすれば手も動かせるし人にみられると思うとその分責任感出ますしね！

あと個人的に今自作PCを作りたいとも考えているのでこの機会に詳しくなっとこうと思ったのも理由の一つです笑

もしかすると間違っている点などあるかもしれませんので、その時は指摘していただけると嬉しいです。

#■CPU

CPUはコンピュータの中枢部分（人間で言う脳の機能を果たす部分と思っていただけたらいい）で制御と演算を行う装置です。

##CPU内の制御機能と演算機能について

###【制御機能】
制御機能はプログラムの命令を解釈して他の装置（入力装置、記憶装置、演算装置、出力装置）へ指示する機能のこと

制御機能を果たす主な装置は以下の通り

|名称  | 役割 |
|:---------------|:--|
| プログラムカウンタ  | 次に実行すべき命令が入っているアドレスを記憶するレジスタ  |
| 命令レジスタ  | 取り出した命令を一時的に記憶するためのレジスタ  |

###【演算機能（ALU）】
四則演算（足し算、引き算、掛け算、割り算）と、データの演算処置を行います。

演算機能を果たす主な装置は以下の通り

|名称  | 役割 |
|:---------------|:--|
| 凡用レジスタ  | 特に機能を限定していないレジスタ、一時的な値の保持やアキュムレータの代用に使ったりする  |
|ALU | 論理演算装置（[回路](#回路)にて紹介）  |

##CPUが行うプログラムの処理について

###【プログラムの実行手順】
ではCPUがどのように命令を実行していくかと言うと、以下の手順で行われます。

**手順①・・・命令の取り出し（フェッチ）**
プログラムカウンタの示すアドレスを参照して取り出し、命令レジスタに記憶
↓
**手順②・・・命令の解読**
命令レジスタに記憶されたもの（命令部＋オペランド部）のうち、命令部のみが命令デコーダへ送られる
（命令デコーダはこの命令部を解読してその時々に必要な装置（ALUなど）に制御信号を飛ばす役目を持つ）
↓
**手順③・・・対象データ（オペランド）の呼び出し**
命令レジスタ内のオペランド部を基にデータのアドレス（どこにデータが保管されているか）を読み出し、それを凡用レジスタなどに保存
↓
**手順④・・・命令実行**
凡用レジスタから対象データを取り出して演算（ALUなどの演算装置）
その後演算結果を凡用レジスタへ書き戻して終了。
↓
手順①へ戻る

###【アドレス指定方式とは】
上記の手順②にて説明した通り命令レジスタに記憶される形は「**命令部**」と「**オペランド部**」に分かれます。
これをわかりやすく説明すると

「**対象となるもの（オペランド部）を、〇〇（命令部）しなさい**」という意味

ただし対象のアドレスを指すオペランド部は必ずしもいつも同じというわけにはいかないので**アドレス修飾（アドレス指定）**を行う必要があるわけです。その方法にはいくつか種類があり、以下の通りです。

ずらっと書いても訳わからんと思いますが、こんなものがあるんだ〜程度に見ていってください…。

| 指定方式 | 説明 |
|:--|:--|
| 即値アドレス指定方式  | オペランド部に対象となるデータそのものが入っている方式  |
| 直接アドレス指定方式  | オペランド部に記載のアドレスがそのまま実行アドレスとして使える方式  |
| 関節アドレス指定方式  | オペランド部に記載のアドレスが「対象となるデータが入っている箇所を示すメモリアドレス」である方式  |
| インデックス（指標）指定方式  | オペランド部に**インデックスレジスタ（指標）**の値を加算することで実行アドレスを求める方式<br>インデックスレジスタ（連続したアドレスを扱う）を増減させることで同じ命令を繰り返し処理することができる  |
| ベースアドレス指定方式  | オペランド部に**ベースレジスタ**の値を加算することで実行アドレスを求める方式<br>ベースレジスタ（プログラム先頭アドレスを記憶）から差分を指定することでメモリ上のどこにプログラムがロードされても命令を変えなくて済む  |
| 相対アドレス指定方式  | オペランド部に**プログラムカウンタ**の値を加算することで実行アドレスを求める方式<br>プログラムカウンタに指定されたアドレスとオペランド部の差分を足すことでどこにロードされても対応可能  |

##CPUの性能評価
CPUはPCの中枢機能を果たすとのことでその性能は高いに越したことはありません。
自作PCを作るときもCPUだけはいいものを買えといいますもんね…。

よくcorei5だとかi7とか聞きますがその数字だけで判断するのでなくちゃんと処理速度を見れた方が比較できていいですよね。
ってことで次はCPUの性能評価をするために知っておくといい知識を紹介していきます。

###【CPUの性能指標】

CPUの性能は高速であればあるほど処理速度は早くなります。
そんなCPUの性能を表す指標値が以下になります。

■ **クロック周波数**ー『「クロック」と呼ばれる周期的な信号が１秒間に繰り返される回数』のこと。単位は**Hz**

例）クロック周波数１GHzのCPUの１クロックに要する時間を表すと

答えは　**1／1,000,000,000（10^9）秒 = 10^-9秒 ＝ 1n（ナノ）秒**

■ **CPI（Clock cycles Per Instruction)**ー「１命令当たり何クロックサイクルが必要か」を表すもの

**命令に必要なクロック数　x　クロック周波数　**

■ **MIPS（Million Instruction Per Second)**ー 「１秒間に実行できる命令の数」

**1秒　／　命令に必要なクロック数　x　クロック周波数**

※MIPSは１００万単位の表記であるため計算をした後桁合わせを行う必要があります

###【CPUの高速化技術-パイプライン処理-】

**パイプライン処理**とは「複数の命令を並行して実行させること」をいいます。

簡単に説明すると「**各命令段階（ステージ）毎に細かく役割を決めて実行することで各ステージごとの処理が終わり次第次の処理へとバケツリレー方式で処理をすすめる**」考え方です

ただ処理というのは分岐命令が出てきた場合はその処理が確定しないことには次へ進めない分岐条件が出てくることがあります。
そういう時に次の命令を予測して無駄な待ち時間を発生させないため**予測分岐**が行われます。またその予測分岐に基づいて「後々無駄になるかもけど実行しちゃえ」と分岐先の命令を実行する手法が**投機実行**といいます。

###【さらに高速化を図る手法】

**スーパーパイプライン**・・・各ステージの中身をさらに細かいステージに分割する
**スーパースカラ**・・・パイプライン処理を行う回路を複数持たせることで全く同時に複数の命令を実行できる

###【CISC（シスク）とRISC（リスク）】

**CISC（Complex Instruction Set Computer)**・・・CPUに高機能な命令を持たせることによって一つの命令で複雑な処理を実現するアーキテクチャ

**RISC（Reduced Instruction Set Computer)**・・・CPU内部に単純な命令しか持たない代わりにそれらをハードウェアのみで実装して一つ一つの命令を高速に処理するアーキテクチャ

#■最後に

ここまで長々と読んでくださりありがとうございました！
少し説明がわかりにくかった部分があるかと思いますが、もしわからないところがあればコメントしていただけると嬉しいです。

では！次の記事にて！