今日学んだ基本情報の勉強内容(1)


この記事が初投稿になるが、今日から学んだこととか書いていこうと思う。
早速今日やったのは基本情報の勉強である。
全部書くと大変なので忘れそうなところだけ載せる


主に自分用なので見にくい部分もあるかも
##ノイマン型コンピュータ
ノイマン型コンピュータは現在のコンピュータのほとんどに利用されているもので、プログラムを実行時に主記憶上に読み込んでおく<font color="Red">プログラム内蔵方式</font>と、プログラムを1つずつ取り出して順番に実行する<font color="Red">逐次制御方式</font>という構造をもつ。

##CPUのレジスタ
命令を実行するために主記憶上から取り出した命令はCPU上の<font color="Red">レジスタ</font>と呼ばれる記憶装置に保持される。

| 名称 | 役割|
|:-----------|:-------------------------|
|プログラムカウンタ      |次の命令が入っているアドレスを記憶するレジスタ       |
| 命令レジスタ    | 取り出した命令を記憶する |
| インデックスレジスタ       |アドレス修飾で使い、連続したデータの取り出しの際に用いる |
| ベースレジスタ        |プログラムの先頭アドレスを記憶する           |
| アキュムレータ       | 演算で使うデータや演算の結果などを記憶       |
| 汎用レジスタ   |一時的な値の保持や、アキュムレータの代わりになったりする |

##命令の実行手順
①命令の取り出し　→　②命令の解読　→　③対象データの読み出し　→　④命令の実行


①<font color="Red">プログラムカウンタ</font>が示す主記憶上のアドレスから命令を取り出す
プログラムカウンタの値を1つ増やす

②以下のような構造の命令から命令部を取り出して<font color="Red">命令デコーダ</font>に送られ、実行に必要な装置に制御信号を飛ばす
![1569913537449.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/046dc5a0-46c3-acf7-4bb0-bac7209e45c8.jpeg "命令の構造")

③上記の命令においてオペランド部には処理の対象となるデータのアドレスなど(アドレスとは限らない)が入っている
このデータを汎用レジスタに記憶させる

④汎用レジスタに格納したデータを用いて演算し、結果を汎用レジスタに記憶させて終了する

##アドレス指定方式
命令の実行手順の対象データの読み出しで実効アドレスを求める方法がいくつかある

###インデックスアドレス方式

主に配列型などの連続したデータを扱うときに用いられ、以下のような構造をしている。
真ん中にある1という数字がインデックスレジスタ番号になっている
![1569914933883.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/3d45cc97-5e4b-66eb-72cb-427b412b40ac.jpeg "インデックスアドレス方式の命令")

以下のようなインデックスレジスタの値とオペランド部の値を計算することによって実効アドレスを求める
![1569914897897.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/ce2f8d5f-b333-9f23-5bbe-f5e728c39de9.jpeg "インデックスレジスタ")

上の例だとインデックスレジスタのアドレス1に入っている10とオペランド部の100を用いて
100+10 =110
が実効アドレスとなり、主記憶が以下のようになっていたとき<font color="Red">37</font>を取り出すことになる
![1569915087290.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/06c8d3f9-1c75-070f-3598-a35658f7e11d.jpeg "主記憶上の例")

###ベースアドレス指定方式
<font color="Red">ベースレジスタ</font>にはプログラムが主記憶上にロードされた時の先頭アドレスが記憶されていて、このアドレスとの差分値をオペランド部に格納することによってプログラムが主記憶のどの位置にロードされても命令を取り出しやすくなっている。

###相対アドレス指定方式
ベースアドレス指定方式に似ていて、ベースアドレス指定方式がベースレジスタの値を利用するように相対アドレス指定方式では次に実行する命令のアドレスが格納されているプログラムカウンタを利用して計算する。

図をつくるのめんどくさかったから省略

##CPUの性能指標
コンピュータにはクロックと呼ばれる周期信号に合わせて動作している。
このクロックが1秒間に繰り返される回数を<font color="Red">クロック周波数</font>と呼ばれる。
逆に1クロックに要する時間を<font color="Red">クロックサイクル時間</font>と呼ぶ。

###CPI
CPIは<font color="Red">1命令あたりに何クロックサイクル必要か</font>を表す指標

####例:1GHzのCPUで実効に3クロックを要する命令の時

クロックサイクル時間は

```math
\frac{1}{10^{9}} = 10^{-9} = 1ナノ秒
```
3クロック必要なので命令実行時間は

```math
1ナノ秒 \times 3クロック = 3ナノ秒
```

###MIPS
MIPSは<font color="Red">1秒間に実行できる命令の数</font>を表す指標
数字が大きくなるので単位は百万単位で表す

####例:1つの命令を実行するのに平均2ナノ秒かかるというCPUがあったとき
1つの命令に2ナノ秒かかるので

```math
\frac{1秒}{2ナノ秒} = \frac{1秒}{2\times 10^{-9}秒} = 0.5 \times 10^{9}秒\\
= 500,000,000個 = 500MIPS

```

###命令ミックス
実行される命令のクロックサイクル数が異なるときにMIPSを求めるには<font color="Red">命令ミックス</font>を用いる。
それぞれ命令が使われる頻度によって平均をとる

####例:1GHzのCPUが次の命令セットでできていた時

| 命令 | 実行時間(クロック)|出現頻度(%) |
|:-----------|:-------------------------:|:----:|
|命令1      |   10   |60|
| 命令2    |5|40|

```math
平均実行時間は
\frac{1秒}{1GHz} = 10^{-9}秒 = 1ナノ秒\\
命令1 = 10クロック　\times 1ナノ秒\\
命令2 = 5クロック \times 1ナノ秒\\

10ナノ秒　\times 0.60 + 5ナノ秒 \times 0.40 = 8ナノ秒\\

よって
\frac{1秒}{8ナノ秒} = \frac{1秒}{8 \times 10^{-9}秒} = 125000000 = 125MIPS
```
命令ミックスの種類としては科学技術計算で使われる<font color="Red">ギブソンミックス</font>と事務計算で使われる<font color="Red">コマーシャルミックス</font>がある。

###CISCとRISC

CPUのアーキテクチャであるCISCとRISCの比較を以下のようにまとめた

| CISC | RISC|
|:-----------|:-------------------------|
|<font color="Red">マイクロプログラム</font>を内部に記憶させることで高性能な命令が実現できる     |<font color="Red">ワイヤードロジック</font>によってすべての命令をハードウェア的に実装       |
| 命令の追加や変更が容易   | 命令の追加や変更が難しい |
| 便利な命令がそろっているので機械語のプログラム作成が楽       |単純な命令だけなので手作業による機械語のプログラム作成は困難 |
| 命令の実行速度が遅い       |命令の実行速度が速い          |
| 命令の長さや実行速度がバラバラ       | 命令の長さや実行速度がほとんど等しい      |



##参考文献
- [キタミ式イラストIT塾　基本情報技術者　平成28年度]