パソコンが動く仕組み(CPU・メモリ・OS)【復習】

# はじめに
こんにちは、山田です。
今回はパソコンが動く仕組み(CPU・メモリ・OS)について復習をかねて記載していこうと思います。
よろしくお願いします。

# CPU
以下よりCPUについて記載していきます。
## CPU概要
CPUは「**パソコンの頭脳**」と言われています。
CPUに対して、命令を一定の手順化したものを渡すとCPUはメモリに一旦記憶させて、メモリから1つずつ命令を取り出して実行していきます。命令を一定の手順で記載したものを、**プログラム**言います。
上記に記載したように、パソコンは命令を記憶する場所と命令を実行する場所が異なっており、**命令を記憶する装置がメモリ、命令を実行する装置がCPU**になります。
## CPUが命令を実行する順番
CPUの中には、4つのユニットが存在しそれぞれが担当する仕事が異なります。
|ユニット名|動作|
|-----|-----|
|**フェッチユニット**|メモリから読み込む|
|**デコードユニット**|解読する|
|**エグゼキュートユニット**|**ALU**:命令を実行する<br>**レジスタ**：命令やデータを一時的に記憶する|
**ライトバックユニット**|結果を出力する|

![](https://storage.googleapis.com/zenn-user-upload/a48d29547006-20221210.png)
## クロック周波数
CPUの性能は動作速度に比例すると言われています。このCPUの動作速度を向上させる方法としてはクロック周波数を向上させることです。

マザーボード上には**クロックジェネレーター**という装置が搭載されており、このクロックジェネレーターが一定の**クロック周波数**を発信します。
クロックジェネレーターが発信するクロック周波数を**ベースクロック**と呼びます。CPU内部ではこのベースクロックを数倍に上げて高速に動作します。このベースクロックを数倍に上げるために使用するのが**逓倍回路**になり、逓倍回路によってCPU内部のベースクロックが数倍になります。

前述で記載した通り、CPU内部では「命令読み込み→解読→実行→出力」の4つのプロセスを踏む必要があるのでベースクロックを数倍にしています。
クロックジェネレーターが発信するベースクロックを**外部クロック**、CPU内部で数倍にしたベースクロックを**内部クロック**と呼びます。

![](https://storage.googleapis.com/zenn-user-upload/9bce4ebe9a01-20221210.png)

## スーパーパイプラインとスーパースケーラー
CPUの4つのユニットさらに複数の小さなプロセスに分かれさせることができます。この1つ1つのプロセスを**ステージ**呼びます。この各々のステージが1つの仕事が完了したら次の仕事をするようにすればCPUはさらに高速になります。この次から次へと処理することを**スーパーパイプライン処理**と呼びます。

上記のスーパーパイプライン処理が並列して複数存在させるように実現した仕組みが**スーパースケーラー**になります。
CPUに何かさせるときに命令を与えるが、この命令を一般的に**x86命令**と呼びます。
スパースケーラーでは、命令の解読が完了したらx86命令を**μOP(マイクロオペレーション)** という複数の処理しやすい単純命令に分解します。

分解された命令は、メモリ上の**リザベーションステーション**に置かれることになります。リザベーションステーションから、CPUの実行ユニットは5つに分かれ自分が実行できる命令を選んで実行していくことになります。

![](https://storage.googleapis.com/zenn-user-upload/d4c4ad104898-20221210.png)

## キャッシュメモリ
CPUとメモリの動作速度を比較すると、メモリの方が動作速度は遅いです。この問題を解決するためにメモリよりも動作速度の速い**キャッシュメモリ**をCPUとメモリの間に配置することが考えられた。
メモリにはいくつか種類はあるが、主に使用されているのは**ダイナミックRAM**と**スタティックRAM**になります。ダイナミックRAMとスタティックRAMの違いについては以下の通りです。

|種類|特徴|
|----|----|
|**ダイナミックRAM**|記憶する容量は大きいが、動作速度は遅い。|
|**スタティックRAM**|記憶する容量は小さいが、動作速度は速い。|

CPUではキャッシュメモリは**1次キャッシュメモリ**と**2次キャッシュメモリ**があり、両方ともCPUの内部に存在します。

メインメモリからデータ読み込む時は、初めに1次キャッシュメモリと2次キャッシュメモリに書き込み、それからデータの読み込みを実行します。
![](https://storage.googleapis.com/zenn-user-upload/abc1f45cb28f-20221210.png)

次回同じ命令やデータをメモリから読み込むときは、1次キャッシュメモリにあれば1次キャッシュメモリから読み込み、1次キャッシュメモリになければ2次キャッシュメモリから読みこみ、2次キャッシュメモリにもなければメインメモリから読み込むことになります。
![](https://storage.googleapis.com/zenn-user-upload/1a343a3b103c-20221210.png)

# メモリ
以下よりメモリについて記載していきます。
## メモリの種類
メモリには、RAMとROMとに分けられ違い関しては以下の通りです。

|種類|詳細|
|-----|-----|
|**RAM(RandomAccessMemory)**|パソコン起動中のみに、データを自由に記憶させたり読み込んだりできるメモリ。電源が入っていないとデータ維持されない。<br>``● ダイナミックRAM``：メインメモリとして使用<br>``● スタティックRAM``：キャッシュメモリとして使用|
|**ROM(ReadOnlyMemory)**|パソコンが起動していなくてもデータが記憶され、私たちが書き込みできないデータが保存されているメモリ|

## ダイナミックRAM仕組み
パソコンに搭載されているダイナミックRAMと呼ばれるメモリチップはセル単位で構成されており、セル1個に**コンデンサ**と**トランジスタ**という2つの回路で構成されている。
コンデンサには電気信号として0か1が記憶されるようになっている。つまり、コンデンサには**1ビット**のデータが記憶されていることになる。
トランジスタのスイッチをオンにするとコンデンサに電気信号を書き込み、オフにすると電気信号を書き込めないようになっている。

セルは縦横の直角に交わる配線で繋がっており、横の配線を**ワード線**・縦の配線を**ビット線**と呼びます。この配線に電圧をかけることで情報を書き込んだり、読み込んだりすることができるようになる。
![](https://storage.googleapis.com/zenn-user-upload/8e64b9b53d9b-20221210.png)

## メモリからデータを読み込む仕組み
CPUがメモリからデータを読み込むときは、まずCPUから**メモリコントローラ**にメモリの中のデータが記憶されているアドレスを出力する。メモリコントローラはアドレスを**行アドレス**と**列アドレス**の2つに分ける役割があります。

メモリの背面には、行アドレスを指示する **/RAS端子**があります。メモリコントローラが行アドレスを出力して/RAS端子をオンにすると、/RAS端子が有効になります。
結果、行アドレスがメモリ内部の**行セレクタ回路**に到達し、その行アドレスに相当するワード線がオンになります。オンになったワード戦に繋がっているトランジスタがオンになり、コンデンサに記憶されているビットがビット線に乗ります。このビット線に乗ったビットがすべて**センスアンプ**というメモリ内部の装置に送信されることになります。
![](https://storage.googleapis.com/zenn-user-upload/24e82b3754e4-20221210.png)
![](https://storage.googleapis.com/zenn-user-upload/37db50a28cd1-20221210.png)

次にメモリコントローラは列アドレスを出力する **/CAS端子**をオンにします。有効にすることで、列アドレスがメモリ内部の**列セレクタ回路**に到達します。結果、その列アドレスに相当するビット線がオンになります。センスアンプからオンになったビット線の電荷部分だけが選択されて**出力アンプ**という装置に放出されることになります。

![](https://storage.googleapis.com/zenn-user-upload/fe5d375dd79f-20221210.png)
![](https://storage.googleapis.com/zenn-user-upload/d9f1d3e619c3-20221210.png)


列アドレスを連続的に指定して、センスアンプ内のデータを連続的に出力アンプに出力することを**バースト転送**と呼びます。バースト転送では最大8ビットまで連続的に出力されます。

## データをメモリに書き込む仕組み
CPUがメモリにデータを書き込むときは、**書き込むデータ・そのデータを記憶させるアドレス**をメモリコントローラに出力させます。
そしたら、メモリコントローラは書き込みたいデータを出力してメモリ背面にある**データ端子**をオンにします。結果、メモリの**入力アンプという回路に1ビットだけ保持**されることになります。ここから先は、データを読み込み仕組みと同じなので省略します。
センスアンプの対象の列のビット線がオンになったら、入力アンプに保持されている1ビットがに置き換えられます。置き換えられたセンスアンプのデータをワード線で指示している対象の行に書き戻します。
![](https://storage.googleapis.com/zenn-user-upload/af0ea781b73d-20221210.png)
![](https://storage.googleapis.com/zenn-user-upload/c0ff6e4d973e-20221210.png)

# OS
以下よりOSについて記載していきます。
## OS概要
パソコンのスイッチを入れると、CPUが動き出しBIOSという回路から起動プログラムをメモリに読み込んできます。そして、この起動プログラムがハードディスクからIPLというプログラムを読み込み、このIPLがOSをメモリに読み込んできます。
OSは以下の4つのプログラムで構成されています。

**- カーネル**
**- USER**
**- GDI**
**- API**

### カーネルの役割
**①CPU管理**
OSのカーネルの1番目の役割は**CPU管理**です。パソコンを起動するとCPUが動き出しOSをメモリに読み込んできます。そして、この後からはOSのカーネルがCPUに命令して一定の仕事をし始めます。カーネルがCPUを管理してパソコンを動かしています。
![](https://storage.googleapis.com/zenn-user-upload/217a56069a33-20221210.png)
**②マルチタスク**
1台のパソコンで複数の作業を同時に行うことを**マルチタスク**と呼びます。カーネルを使用すれば、アプリケーションの作業を細かく区切り、区切った作業をCPUに瞬間的に切り替えながら動作させることで、複数の作業が同時に行われているように見せることが可能になります。
![](https://storage.googleapis.com/zenn-user-upload/ba1e32785bb4-20221210.png)
**③メモリ管理**
CPUが使用できるメモリ領域は**ユーザー領域**と**OS領域**の2つに分けることができます。アプリケーションを起動すると、ハードディスクからアアプリケーションを読み込んできてメモリのユーザー領域に記憶します。その後、アプリケーションを使用してデータを作成するとカーネルはメモリのユーザー領域の空いている領域に記憶させます。メモリの空きがなくなると、ハードディスクに記憶されていきます。このメモリの不足分を補うハードディスクの記憶領域を**仮想記憶領域**と呼びます。
カーネルとデータのメモリの割り当てを**メモリの管理機能**と呼びます。
![](https://storage.googleapis.com/zenn-user-upload/df841fde3572-20221210.png)
**④ファイル管理機能**
アプリケーションを使用して作成したデータの保存を命令すると、それがファイルの場合ハードディスクに保存されます。この時、ハードディスクのどこが空いているのか気にする必要はありません。ファイル名、ファイルの種類を指定するとカーネルがハードディスクの空いている場所に、ファイル名、ファイルの種類、ファイルの大きさなどを記憶して保存してくれます。
以上のように、カーネルのファイル保存、削除、ファイル名の変更をする機能を**ファイルの管理機能**と呼びます。
### USER
ユーザーインターフェースの動きを監視して、操作に応じて処理するプログラムを**USER**と呼びます。USERが入力機器からの操作を受け取り、その後OSのカーネルがそれを受け取り、はじめてCPUやメモリなどのハードウェアが動き出します。
![](https://storage.googleapis.com/zenn-user-upload/4e775278a12b-20221210.png)
### GDI
GDIは、**グラフィックユーザーインターフェース**のことです。
画像情報をOSのUSERが受け取ると、USERからGDIに情報が転送されます。GDIからカーネルに情報が転送され、カーネルがグラフィックカードの中心装置であるGPUに情報を転送します。GPUがそれをグラフィックスメモリに転送して画面上に画像が表示されます。
![](https://storage.googleapis.com/zenn-user-upload/ac2d95afd1b2-20221210.png)
### API
APIとはアプリケーションソフトでの操作情報を受け取り、それをカーネルに渡すプログラムです。
![](https://storage.googleapis.com/zenn-user-upload/8eac2d4afeb5-20221210.png)

# 終わりに
今回はパソコンが動く仕組みについて記載しました。
エンジニアになって、2年が経過しましたが基礎が抜けてると会話についていけない、考えることができない状況になってしまうなとつくづく感じています。
これからも日ごろの業務を行う中で、基礎が抜けてるなと感じたら記事にしていこうと思います！
今回記載した内容が誰かの役に立てばと良いなと思います。
最後まで見てくださりありがとうございます。

以上