【SRE】コンピュータの構成と設計 ~プロセッサ編~


この記事は下記書籍を主に参考にしています。
[コンピュータの構成と設計 第5版 上 \| デイビッド A パターソン, ジョン Ｌ ヘネシー, 成田 光彰 | コンピュータ・IT | Kindleストア | Amazon](https://www.amazon.co.jp/dp/B00UJ42A0K/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)


## コンピュータが実行すること
1. 情報を受け取り(入力)
2. その情報を記憶し(記憶)
3. それを用いて演算し（演算）
4. 出力する(出力)
5. 上記全てを制御する(制御)

[Mac でアセンブリを書いてみる - Qiita](https://qiita.com/dora-gt/items/889a564ebd682fbe4257)

これらをうまく設計してくれているものが、コンピュータになります。

## コンピュータが理解する言語
当たり前ですが、通常自分たちが使っているプログラミング言語を機械は読み取ってくれることはありません。
機械が読めるコードは、0と1の2進数で構成されていなければいけません。

仮にC言語を使用しているものとします。
その場合、下記の手順を踏むことで、コンピュータは命令を読み取り、命令を実行できています。

1. C言語をコンパイルし、機械語プログラムに翻訳
2. リンカでプログラムを統一
3. ローダでメインに読み込み、実行できるようにします。

[アセンブリの意味とは？エンジニアが知っておくべき基礎知識](https://persol-tech-s.co.jp/hatalabo/it_engineer/478.html#_-4)

### リンカ
>複数のプログラム部品を結合して1個にまとめるプログラム
[プログラミングの概要](http://www.ibe.kagoshima-u.ac.jp/edu/gengo0/p2.html)より引用

個々にアセンブルされた機械語のプログラムを統合してくれます。


## プロセッサの処理の流れ
ではさらに細部を見ていきましょう。

### 主に出てくるメンバー

1. プログラムカウンタ(PC)
2. 命令レジスタ
3. レジスタ
4. ALU
5. メモリ

### 命令を実行するまでの5つのステップ
1. 命令を取り出す
2. 命令のデコード, レジスタフェッチ
3. 命令実行・アドレス作成
4. データ・メモリ・アクセス
5. 書き込み


超簡単にまとめると下記のような図になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/78157df3-3855-a0ca-185d-2cfe0ad60251.png)

※PCは、プログラムカウンタのことですよー。

さらに細かくなると下記のようなイメージです。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/c66a8a9c-a86d-a219-b994-700429c4414c.png)
[第8章 「コンピュータシステム」](http://www.vision.is.tohoku.ac.jp/files/8214/9663/4924/8th-2.pdf)より引用


変数を定義した場合には、その変数はメモリに作成されます。
そのあと、演算がある命令に関しては、メモリからレジスタにデータをコピーしてきて、それをALUで計算してあげる。
その計算結果をメモリに読み込んであげて、結果を出力してあげています。

### アドレス
メモリ上の番地のことを指します。
このアドレスを使って、データを取り出します。

[変数とメモリの関係 - 苦しんで覚えるC言語](https://9cguide.appspot.com/15-02.html)


### 命令の構成
命令は2つで構成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/29cf0800-aaad-4b9d-a89b-224f0ed49a99.png)


アドレス部のところは指定の方法がいくつかあり、
アドレスをそのまま使って、データを取り出す**直接アドレス方式**、
アドレス部のデータが指し示すメモリアドレスにはデータではなく、アドレスが入っていて、そのアドレスにデータが入っている**間接アドレス方式**などがあります。

### レジスタ
>レジスタはCPUに内蔵された記憶装置で、演算結果や実行状態などを保持するために利用されます。

レジスタは様々な働きが存在します。

#### プログラムカウンタ（PC）
- 現在実行しているプログラムの番地を格納します
- プログラムの流れの制御を行います

#### 命令レジスタ
>命令自体を保持するためのメモリである．
[コンピュータの基本構成要素](https://www.gsic.titech.ac.jp/matsuda/l/CS/arch/index.htm)より引用

プログラムには、命令と命令に含まれるデータが含まれています。
これを一つ一つ取り出し、解釈し(decode)、実行していきます。

#### 命令レジスタ（IR）
- メモリから読み出した命令を一時的に記憶します

#### メモリアドレスレジスタ（AR）
- メモリに対してこれから操作するアドレスを格納します
- メモリ装置はここを参照して指定されたアドレスにアクセスします

#### メモリデータレジスタ（MR）
- メモリから読み出されたデータを格納します
- メモリに書き込むデータを格納します

[第8章 「コンピュータシステム」](http://www.vision.is.tohoku.ac.jp/files/8214/9663/4924/8th-2.pdf)


### ALU
>ALUはCPUに内蔵されていて、算術演算や論理演算を行う装置です。
[マイクロプロセッサ](http://www.am.ics.keio.ac.jp/chuo_aki/alu.pdf)より引用

**ALUができること**

- 整数演算操作 (加算、減算、乗算)
- 論理演算 (AND、NOT、OR、XOR)
- ビットシフト操作

[it-shikaku.jp - コンピュータシステム - 3.コンピュータ構成要素 - 1.プロセッサ - 4.プロセッサの構造と方式](http://www.it-shikaku.jp/top30.php?hidari=03-01-04.php&migi=km03-01.php)

**シフト**
ビットを左または右にずらして、空いた部分に0をうめる操作のことを指します。


#### 機能
**ロード（load）**
変数の値（主記憶の内容）をレジスタに読み出します。

**ストア（store）**
レジスタの内容を変数に格納する（主記憶に）書きこみます。

[コンピュータの仕組み\|CPU|ALU|レジスタ|メインメモリ|バス|アドレス指定方式](https://kmownet.com/info-science-basic/020-principle/026-operation/026-operation.html)

### メモリ
主記憶(main mamory) とも呼ばれます。
データとプログラムを記憶しておく場所です。
メモリにはアドレスが振られており、このアドレスによってメモリを特定し、データのやりとりを行います。

### バス
レジスタ同士やALUとを繋いでくれます。
主にデータバスとアドレスバスがあります。


### MUX
数の電気信号をひとつの信号にする回路のことを指します。
今回の図では出てきていませんが、さらに詳細の図になると必ず出てきます。
[マルチプレクサ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AC%E3%82%AF%E3%82%B5)


### 参考にした記事
[コンピュータの仕組み\|CPU|ALU|レジスタ|メインメモリ|バス|アドレス指定方式](https://kmownet.com/info-science-basic/020-principle/026-operation/026-operation.html)
[コンピュータの構造と命令](http://www.hino.meisei-u.ac.jp/is/iga/lecture/arc/No4note.pdf)


## TODO
### パイプライン処理
複数の処理を少しずラジ、同時並行的に実行する方法のこと。
上記であげた命令のフェッチやデコードな度を並行的に進めることになる。

[パイプライン処理の基本を学ぶ - ponsuke_tarou’s blog](http://ponsuke-tarou.hatenablog.com/entry/2019/03/14/235103#%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E5%87%A6%E7%90%86%E3%81%A8%E3%81%AF%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%81%AE%E9%AB%98%E9%80%9F%E5%8C%96%E6%89%8B%E6%B3%95%E3%81%AE%E4%B8%80%E3%81%A4%E3%81%A7%E3%81%99)

### クロックサイクル
[CPU基礎知識　備忘録：クロック数、クロックサイクル - SIMPLE 0 シリーズ　：　ザ・備忘録](http://wawawassyoi.hatenablog.com/entry/2016/10/30/010136)