Web Analytics Made Easy - StatCounter

工業大学生ももやまのうさぎ塾

4年間+2年間の工業大学・大学院で学んだ知識やためになることを投稿していきます

うさぎでもわかる計算機システム Part06 プロセッサの基礎

こんにちは、ももやまです。
今回は計算機、特にプロセッサについての簡単なまとめを行いたいと思います。

 

1.計算機の5大要素

皆さんは計算機(コンピュータ)と言ったらなにを思い浮かぶでしょうか。

例えば、スマホ・炊飯器・電卓・そろばん・プレステ4・switch(ゲーム機)など様々なものが思い浮かびます。

 

しかし、情報の世界で「計算機」と呼ばれるものは、下で書く5つの要素を全て持ったもののことを言います。

  1. 入力部(データ・プログラムを入力する。人間で言う目・耳・鼻)
  2. 出力部(プログラムの演算結果を出力する。人間で言う口・手・足)
  3. 演算部(プログラムに基づいて演算を行う。人間でいう脳)
  4. 記憶部(入力部で入力されたデータ・プログラムを記憶する。人間でいう脳)
  5. 制御部(上の4つの部の機能を効率よく動作させるような制御を行う。人間でいう神経部分)

を持っているものが「計算機」と呼ばれます。
(〜部ではなく、〜装置という言い方をすることもあります)

 

5つの部の関係を図示するとこのような感じとなります。

f:id:momoyama1192:20190709235123g:plain

人間に例えてみた図も用意しました。

f:id:momoyama1192:20190709235111j:plain

 

例えば、switch(ゲーム機)は、

  1. 入力部 → コントローラーとかで入力
  2. 出力部 → 画面に表示
  3. 演算部 → あらゆる部分で演算が行われている
  4. 記憶部 → セーブデータなどが記録されている
  5. 制御部 → (ほぼ全てのゲームが)快適にプレイするためにきちんと制御されるのでOK

なので計算機といえます。

しかし、電卓はどうでしょうか。
例えば、電卓を使って分散*1を計算してあげましょう。

確かに人間が問題(式)を何回か入力すれば、電卓は答えを出してくれます。

 

しかし、同じ問題でも違うデータになればどうでしょうか。
また人間は手打ちで計算式を入力してあげなければなりませんね。

計算式を記憶する部分がないのです。

なので計算機とは言えませんね……(同じくそろばんも計算機ではありません)。

 

計算機であれば、計算過程をプログラムし、記憶させることでデータさえ入れればあっという間に計算をしてくれます。

 

 

 

2.機械語・アセンブラ・高級言語

sumas.cは、1〜10の和を表示するプログラムとします。

(1) 機械語

プロセッサは残念ながら人間が書いたプログラミング言語(C言語・Javaなど)を理解することができません。理解できるのは0,1の2進数のみです。

プロセッサが直接実行することができる2進数で書かれた言語のことを機械語と呼びます。直接実行するため、実行内容はプロセッサに依存します。

 

試しにsumas.cというファイルの機械語はどうなっているかを見てみましょう。機械語をみたいときは、

cc -c sumas.c 

と端末で打ち込みます。すると、sumas.o という機械語のファイルが出来上がります。この中身をエディタなどで見るとバグるのでまたコマンドを打ちます。

hexdump sumas.o

と打つと、

0000000 cf fa ed fe 07 00 00 01 03 00 00 00 01 00 00 00
0000010 04 00 00 00 08 02 00 00 00 20 00 00 00 00 00 00
0000020 19 00 00 00 88 01 00 00 00 00 00 00 00 00 00 00
0000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮
00002f0 4b 00 00 00 01 00 00 2d 41 00 00 00 02 00 00 15
0000300 00 00 00 00 01 00 00 06 01 00 00 00 0f 01 00 00
0000310 00 00 00 00 00 00 00 00 07 00 00 00 01 00 00 00
0000320 00 00 00 00 00 00 00 00 00 5f 6d 61 69 6e 00 5f
0000330 70 72 69 6e 74 66 00 00                        
0000338

 

と実行結果が出てきます。これが機械語です(16進数で表されているので0と1以外の数字も表示されている)。

もう嫌だ!!!

となりますよね。なので、機械語を理解するのは諦めてください

 

 

(2) アセンブラ(アセンブリ言語) 

アセンブラは、機械語よりは人間が理解することができます。

また、機械語と1対1対応しています。なので、機械語と同じくプロセッサに依存します。アセンブラを機械語に直すことをアセンブルといいます。

 

主に限界の処理速度を求めるときや、プロセッサの細かい部分を制御するときなどにアセンブラを使います。

 

試しにアセンブラはどんな感じに書かれているのか、サンプルプログラム sumas.c を使って確認してみましょう。

cc -S sumas.c 

と打ち込むと、sumas.s というファイルが生成されます。この中身を見てみると、

    ⋮ ⋮ ⋮ ⋮ 
_main: ## @main .cfi_startproc ## %bb.0: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp subq $16, %rsp movl $0, -4(%rbp) movl $0, -8(%rbp) movl $1, -12(%rbp) LBB0_1: ## =>This Inner Loop Header: Depth=1 cmpl $10, -12(%rbp) jg LBB0_4 ## %bb.2: ## in Loop: Header=BB0_1 Depth=1 movl -12(%rbp), %eax addl -8(%rbp), %eax movl %eax, -8(%rbp) ## %bb.3: ## in Loop: Header=BB0_1 Depth=1 movl -12(%rbp), %eax addl $1, %eax movl %eax, -12(%rbp) jmp LBB0_1
     ⋮ ⋮ ⋮ ⋮

 

となります。

まだ理解しようと思えば理解できますよね。

 

(3) 高級言語

高級言語は、(アセンブラや機械語に比べて)人間が理解できるような形で書かれた言語です。C言語、Java、Python、Rubyなど皆さんが聞いたことがあるようなほとんどの言語は高級言語です。

 

高級言語をアセンブラや機械語などより低級な言語に変換(翻訳)することをコンパイルといいます。

コンパイルをするためのソフトをコンパイラといいます(ごちゃごちゃになるので注意!)。

 

sample.c はC言語で書かれているので高級言語です。中身を見てみましょう。

/// sumas.c
#include<stdio.h>

int main() {
    int sum = 0;
    for(int i = 1; i <= 10; i += 1) {
        sum += i;
    }
    printf("Total:%3d\n",sum);

    return 0;
}

(アセンブラや機械語と比べたら)かなり簡単に実行内容を把握することができますね。

 

3.プロセッサの動き

プロセッサの命令実行には4つのステップがあります。4つのステップでどのようなことをするのかを順番に説明していきましょう。

Step1  命令フェッチ

まずは、どのような命令を実行するのかを計算機に聞いてあげる必要があります。

 

このステップでは、プログラムカウンタ(Program Counter, PC)と命令レジスタ(Instruction Register, IR)の2つの部品を使います。

 

 

(1) プログラムカウンタ(PC)

プログラムカウンタは、次に実行される命令のアドレス(メモリ番地)を保存しておく部品です。

(2) 命令レジスタ(IR)

命令レジスタは、現在実行している命令の内容を格納する部品です。

 

このStep1では、プログラムカウンタに入っているアドレス(メモリ番地)データを、命令レジスタに読み出す操作を行います。

 

わかりやすく言うと、次に実行する命令をプログラムカウンタに聞き、聞いた結果を命令レジスタに保存する、ということになります。

 

Step2  命令解読

命令を読み込んでもそれがどんな命令なのか分からなければ困りますよね。

読み込んだ命令を解読するのがこのStep2にあたります。

 

このステップではデコーダと命令レジスタを使用します。

(3) デコーダー

Step1で命令レジスタに保存した命令がどんな命令なのかを解読するのがデコーダーです。

 

 

Step2では、命令レジスタ(IR)の命令をデコーダーで解読し、命令実行に備えます。

 

Step3  命令の実行

いよいよ命令が実行されます。

このステップで使用するのはALU(演算装置)とACC(アキュムレータ)です。

(4) ALU (Arithmetic and Logic Unit)

AULは、実際に算術演算・論理演算を行う部品です。

(5) ACC (Accumulator)

ACC(アキュームレータ)は、計算をした結果を格納する部品です。

 

Step3では、ALUで計算を行い、計算結果をACCに格納します。

 

Step4  結果の格納

ACCで格納した結果を必要であればメモリ・レジスタに格納します。

 

Step5  別の命令へ

つぎの命令にうつり、またStep1に戻ります。

 

以上の5ステップがプロセッサの動きとなります。

 

4.練習問題

では、実際に練習しましょう。

練習1

計算機の5大要素を答えなさい。

 

練習2

CPUのプログラムカウンタ(プログラムレジスタ)の役割はどれですか。

[基本情報技術者平成23年秋期 午前問10]

ア:演算を行うために、メモリから読み出したデータを保持する。
イ:条件つき分岐命令を実行するために、演算結果の状態を保持する。
ウ:命令のデコードを行うために、メモリから読み出した命令を保持する。
エ:命令を読み出すために、つぎの命令が格納されたアドレスを保持する。

練習3

正しい文章を2つ選びなさい。

  1. C言語・Java・アセンブラ・Pythonなどは高級言語と呼ばれている。
  2. 機械語の実行内容はプロセッサに依存している。
  3. 命令レジスタ(IR)には、次に実行する命令のアドレスが保持されている。
  4. メモリ上のデータは読み出し専用であり、書き込むことができない。
  5. 機械語は2進数で表されており、計算機が直接実行することのできる言語である。

練習4

コンピュータは、入力・記憶・演算・制御及び出力の5つの機能を実現する各装置から構成される。命令はどの装置から取り出され、どの装置で解釈されるか。

[基本情報技術者平成18年春期 午前問26]

  取り出し 解釈
演算 制御
記憶 制御
制御 演算
入力 演算

 

 

5.練習問題の答え

解答1

入力部・出力部・演算部・記憶部・制御部

 

解答2

解答:エ

ア:汎用レジスタ(用途がないただのレジスタ、メモリから読み出したデータを記憶するだけ。)
イ:アキュームレータ(ACC)のこと。
ウ:命令レジスタ(IR)のこと。(命令レジスタとプログラムカウンタは間違えやすいので要注意!!)
エ:正しい!!

解答3

解答:2,5

  1. アセンブラは高級言語ではないので×。
  2. OK(ちなみにアセンブラも機械語と1対1なので依存している)
  3. 命令レジスタに保存されているのは、実行中の命令の内容なので×。選択肢の記述はプログラムカウンタである。
  4. メモリにはデータを書き込むこともできるので×。
  5. OK。

解答4

解答:イ

命令はプログラムカウンタから取り出され、デコーダで解読される。

プログラムカウンタは、次に実行される命令のアドレスが保存されている装置、デコーダは命令内容を解読する装置である。

 

よって記憶装置(記憶部)から取り出され、制御装置(制御部)されることがわかるので答えはイ。

(解読された命令を実際に演算するので、演算部ではないことに注意)

 

6.さいごに

今回はプロセッサについて簡単にですがまとめてみました。

次回は、実際にプロセッサが命令をどのように実行しているかを見ていきましょう。

*1:計算ステップとしては、まず最初に平均点を計算し、つぎにそれぞれのデータごとの差の2乗を取って、最後にデータ数で割る、となる。