ここでは、コンピュータの仕組みについて学びます。最初に、身近な電卓を例にとって、データがどのように処理されているのかを考察した後、コンピュータの仕組みが電卓とどのように異なっているのかを考えます。我々が通常電卓を用いる時目にするのは、電卓のキーと表示の部分だけですが、その内部では密接に関連しあった精密な電子回路によってデータの処理がおこなわれています。
電卓もコンピュータも、その内部に4つの機能を持っています。すなわち、(1)入力、(2)記憶、(3)演算、(4)出力の4つです。我々が電卓のキーを打てば、いともあっさりと計算結果が表示されますが、それはこうした内部の処理を経て行われることなのです。
ここでは、電卓の内部構造のモデルを作成し、その中で情報がいかに流れ、いかに制御されているかを逐次追い、理解します。上で、電卓には4つの機能があると述べましたが、それをモデル化したのが図1です。
図1 電卓のモデル
図1において、キーボードは入力の機能を持ち、データ(0〜9の数字)や命令(+や×の演算子)を入力するのに用いられます。データレジスタと命令レジスタは、記憶の機能を持ち、それぞれキーボードから入力された0〜9までの数字データと命令(演算子)を記憶します。計算機構は、計算の機能を持ち、レジスタの中身を参照して計算を行います。表示機構は、データレジスタ1の内容をディスプレイに表示します。データレジスタ2の値は表示されません。ここで、実際の計算が行われる様子を見てみましょう。
ここで使用する電卓は次のような機能を持つものとします。
・0〜9の10個の数字キー、加減乗除、イコール、クリア、オールクリアの7個の命令キーを持つ
・キーボードからの入力が数字キーであれば、データレジスタ1に記憶される。
・キーボードからの入力が加減乗除の命令キーであれば、命令レジスタにどのキーが押されたかを記憶し、同時にデータレジスタ1の値をデータレジスタ2にコピーする。
・キーボードからの入力が=キーのとき、命令レジスタに記憶されている情報(演算子)にしたがって、データレジスタ1とデータレジスタ2の対を計算機構で計算をし、その結果をデータレジスタ1に書き込む
(1)まず2キーが打たれると、これは数字キーなので、データレジスタ1に記憶されます。
(2)次に+キーが打たれると、これは加減乗除の命令キーなので、命令レジスタに記憶されます。同時に、データレジスタ1の値である「2」がデータレジスタ2にコピーされます。現段階で、データレジスタ1,2には共に2が、命令レジスタには+が記憶されています。
(3)3キーが打たれると、これも数字キーなので、データレジスタ1に前の値2に代わって記憶されます。この段階で、データレジスタ1には「3」が、データレジスタ2には「2」が記憶されています。表示機構はデータレジスタ1の内容しかディスプレイに表示しないので、ディスプレイには「3」が表示されています。
(4)次に、=キーが打たれると、命令レジスタには+が記憶されているので、データレジスタ1とデータレジスタ2の値を用いて、計算機構で加算が行われます。そして、その結果がデータレジスタ1に書き込まれます。データレジスタ1の内容が表示機構によって表示されるので、ディスプレイには演算の結果である「5」が表示されます。
【表1】レジスタの値の変化
キー入力 |
2 |
+ |
3 |
= |
データレジスタ1 |
2 |
2 |
3 |
5 |
データレジスタ2 |
/ |
2 |
2 |
/ |
命令レジスタ |
/ |
+ |
+ |
/ |
表1は、それぞれのレジスタの値がどのように変化したかを表しています。簡単にまとめれば、数字キーが入力されるとまずデータレジスタ1に記憶されます。命令キーが入力されると命令レジスタに記憶されると同時にデータレジスタ1の内容がデータレジスタ2にコピーされます。=キーが押されると、命令レジスタの中身に基づいて(この場合は+)データレジスタ1とデータレジスタ2の値を計算します。結果はデータレジスタ1に書き込まれます。
さて、我々が日常使っている電卓の中でデータがどのように処理されているのかを見てきましたが、次にコンピュータはどのような流れに従ってデータを処理していくのかを見ていきます。ここでは、主な機能が実際にどのような役割をになっているかを詳しく学びます。
コンピュータの心臓部を構成するのは、中央処理装置(CPU)と主記憶(一次記憶)装置です。これらの装置は、半導体素子を高密度に集めた集積回路の組み合わせです。コンピュータは命令を解釈し、それにしたがって演算を実行することでデータ処理を行っています。コンピュータはデータ処理のために、主な機能として制御、演算、記憶、入力、出力の機能を持っています。電卓と比べると、制御という機能が増えていることが分かります。コンピュータの制御機能とは、命令の流れやコンピュータを構成する装置の動作を管理する機能のことです。演算機能は命令を解釈して演算を実行する機能のことであり、中央処理装置は、この制御機能と演算機能をもっています。
コンピュータは、実行する命令やデータを中央処理装置に近いところに全て蓄え、これらを命令に応じて読み出して処理を行います。このために、コンピュータには記憶機能が必要です。主記憶装置は一時的にプログラムやデータを記憶し、中央処理装置にそれらを直接提供します。
パーソナルコンピュータなどではプログラムやデータを保管するために補助記憶(二次記憶)装置を使用します。補助記憶装置は普通主記憶装置よりも大容量で、多くは周辺機器として設けられます。そのため、外部記憶装置とも呼ばれます。しかし、主記憶装置と比較すると読み書きの速度は遅いという特徴があります。
また、パーソナルコンピュータなどでは人間とコンピュータがコミュニケーションを行うために入力装置と出力装置を設けます。入力装置は人間の意図を伝えるために使われ、キーボードやマウスなどの装置があります。出力装置はコンピュータのデータ処理の結果を表示するもので、ディスプレイやプリンタなどの装置が使われます。
では、それぞれの装置について動作の仕組みを見てみましょう。まず、キーボードやマウスなどの入力装置を使ってソフトウェアを実行する指示を行うと、ソフトウェアがハードディスクなどの補助記憶装置から主記憶装置に読み込まれます。文書処理ソフトウェアや表計算ソフトウェアは、文書データや表計算データを作成、編集し、これらのデータも主記憶装置に置かれます。
キーボードからデータを作成、編集するための命令を打ち込むと、ソフトウェアがこの命令を中央処理装置に伝え、必要なデータの一部が取り出されて、中央処理装置がデータに処理を加えます。データに処理を加えた途中経過や結果は、ディスプレイ上に表示され、作成した文書や表、計算結果はプリンタなどに出力することもできます。
コンピュータの電源が切れると主記憶装置で記憶した内容は消えてしまいます。そのため、作成、編集が済んだデータを保存する場合は、主記憶装置から補助記憶装置に移し、そこに保存します。
コンピュータの制御・演算・記憶・入力・出力の基本的な機能はどのようなハードウェアで実現されているのでしょうか。
中央処理装置は、演算機能と制御機能を担い、主記憶装置上のプログラムから一つ一つ命令を読み出して実行する装置です。その性能は、一つの命令で処理できるデータのビット数や動作速度で表されます。
一つの命令で処理できるデータのビット数に応じて32ビットCPUや64ビットCPUなどがあり、データ処理の速度や規模に対応しています。また、中央処理装置の各部分の基本動作のタイミングを合わせるために、一定の時間間隔でクロックと呼ばれるパルス信号を発生させており、このクロック信号の間隔が短ければ短いほど中央処理装置の各部分の動作は速くなります。クロックが1秒間に何回あるかを示す数値としてクロック周波数が使われます。一般にその周波数が高ければ中央処理装置の動作速度も速いということができます。
記憶装置には、主記憶装置(メモリ)と補助記憶装置があります。主記憶装置は高密度の半導体記憶素子で構成されることが多く、その容量はコンピュータの性能を示すものの一つです。補助記憶装置には、ハードディスクのほかに、フロッピーディスクドライブやMO(光磁気ディスク)ドライブなどが使用されます。
DVDドライブやCD-ROMドライブは、映画やゲームなどの大容量のソフトウェアの読み出し専用の補助記憶装置ですが、パーソナルコンピュータからDVDやCD-ROMを作成することができる装置でもあります。
記憶装置の性能はその記憶容量や読み書きの速度で測られますが、容量や速度の組み合わせは様々で、用途・目的によって使い分けられています。
データやプログラムは、ハードディスク装置などの補助記憶装置にファイルとして保存されていたり、キーボードなどの入力装置から直接入力されたりします。これらのデータやプログラムは、そのまま中央処理装置が処理するのではなく、主記憶装置に送られ、そこに蓄えられます。
中央処理装置は主記憶装置に蓄えられたプログラムやデータを読み込んで処理を行い、結果を再度主記憶装置に書き出します。そのため、データをハードディスク装置などにファイルとして保存するためには、保存操作を別に行う必要があります。主記憶装置は、一般にバイトという単位でデータを扱っています。1バイトは一般的に8ビットです。データを読み書きするために、このバイト単位のデータを収める小さな区画が論理的に設けられています。主記憶装置上のそれぞれの区画には、場所を示す数が割り当てられており、それぞれの区画の場所を示すそのような数を、アドレス(番地)と呼びます。
中央処理装置や出力装置は、指定したアドレスから命令やデータを読み込んで処理を加えたり出力を行います。また、中央処理装置の処理結果や入力装置からの入力は指定されたアドレスに書き込まれます(図2−1)。
図2−1 主記憶装置への命令やデータの読み込み・書き込みの仕組み
プログラムはたくさんの命令が順番に並んだ集まりです。それを一つずつ「取り出し」、「解読し」、「実行する」という動作が繰り返し行われます。コンピュータは、基本的にこの命令を一つずつ実行していきます。そのため、命令を実行する順序は非常に重要です。
命令は一般に処理の種類を表す命令部と処理するデータのアドレスを示すアドレス部の二つの要素から構成されます。制御装置には「次に実行する命令のアドレス」を記憶している場所があって、これにしたがって命令を取り出す仕組みになっています。
コンピュータが命令を実行し、データ処理を行う仕組みは図2−1の通りです。命令は次のような手順で実行されていきます。
1 制御装置はプログラムによって設定された実行開始アドレスを「次に実行する命令のアドレス」として指定し、以下の2〜6を繰り返します。
2 「次に実行する命令のアドレス」にある命令を制御装置に読み込む。
3 制御装置に設定された「次に実行する命令のアドレス」を一つ進める。
4 制御装置は命令部を取り出して解読する。
5 制御装置はアドレス部からデータのアドレスを決める。
6 解読された命令とデータのアドレスにしたがって処理を行う。命令が実行順序を変更する命令のときは「次に実行する命令のアドレス」を変更する。
このように、コンピュータは主記憶装置に蓄えられた命令を順序だてて一つずつ取り出しては実行し、その流れは停止命令が実行されるまで続きます(実際には、プログラムは「それを管理している上位のプログラムに制御をゆだねる」という形で終了します)。複数の命令があっても、それぞれの命令を同時に行うのではなく、一つずつ実行することに注意しましょう。このようなデータ処理を逐次処理といいます。
では、実際にコンピュータの仕組みや機能、効率を理解するために、一つの仮想的なコンピュータのモデルを考え、その各部分がどのように機能しているかを見てみましょう。このコンピュータのモデルは図2−2のようになっているとします。
図2−2 コンピュータのモデル
◎用語
・制御装置
中央処理装置の一部であり、コンピュータの各部分に支持を出す役割を持ちます。
・演算装置
中央処理装置の一部であり、計算を担当し、計算結果をレジスタに渡します。
・主記憶装置
プログラムやデータを記憶します。
・入力装置
主に、キーボードです。操作する人間が入力するデータを受け取ります。
・出力装置
ディスプレイです。出力を担当し、中央処理装置から送られたデータを表示します。
・バス
中央処理装置と主記憶装置の間でプログラムやデータをやり取りをします。
・プログラムカウンタ
「次に実行する命令のアドレス」を記憶している場所です。
・レジスタ
中央処理装置の一部で、記憶装置から読み込んだデータや演算の結果を一時的に記憶する場所です。
このコンピュータのモデルでは、表2−1のような命令を実行することができます。一つ一つの命令は図2−3のように16ビットで構成され、上位の1バイトが命令部、下位1バイトがアドレス部となっています。データもまた16ビットで一つのデータとして扱われます。
命令部
|
アドレス部
|
|
2進表示 | 01000000 | 00000101 |
16進表示 |
40
|
05
|
図2−3 命令の構成
命令部 | アドレス部 | 説明 |
00 | 無視 | Halt: 停止する |
10 | ×× | Jump: ××番地にジャンプする |
11 | ×× |
JumpZ: レジスタの内容がゼロであれば、××番地にジャンプする |
12 | ×× | JumpP: レジスタの内容がゼロより大きければ、××番地にジャンプする |
13 | ×× | JumpN: レジスタの内容がゼロより小さければ、××番地にジャンプする |
20 | 無視 | Read: キーボードからデータを読み込みレジスタに入れる |
30 | 無視 | Write: レジスタの内容をディスプレイに表示する |
40 | ×× | Load: ××番地の内容をレジスタに読み込む |
50 | ×× | Store: レジスタの内容を××番地に書き込む |
60 | ×× | Add: レジスタの内容と××番地の内容を加算してその結果をレジスタに入れる |
70 | ×× | Subtract: レジスタの内容から××番地の内容を減算してその結果をレジスタに入れる |
表2−1 命令表
基本的な作業の流れは、以下の1〜5のステップの繰り返しです。
1 制御装置は、プログラムカウンタの内容をアドレスとして、主記憶装置から命令を取り出すように、バスに指示します。
2 バスは、主記憶装置の指定されたアドレスから命令を取り出し、制御装置に渡します。
3 制御装置はプログラムカウンタの内容に1を加えます。
4 制御装置は、読み込んだ命令を解読し、アドレスを計算します。
5 制御装置は、解読した命令と計算したアドレスにしたがって、実行します。
図2−4のプログラムは、主記憶装置の05番地の内容と06番地の内容を足して、07番地に格納し、さらにディスプレイに表示するというものです。このプログラムの最初の命令は次のようにして実行します。
アドレス 内容 00 4005 01 6006 02 5007 03 3000 04 0000 05 0001 06 0002 07 0000 |
図2−4 プログラム
1 あらかじめ主記憶装置の00番地から07番地の内容を、図2−4のようにセットします。また、プログラムカウンタの内容を00にセットします。
2 制御装置は、プログラムカウンタの内容(00)をアドレスとして、主記憶装置から命令を取り出すように、バスに指示します。
3 バスは、主記憶装置の00番地からその内容(4005)を取り出し、制御装置に渡します。
4 プログラムカウンタの内容に1を加えます(00→01)。
5 制御装置は、読み込んだ命令(4005)を解読(命令部は40なのでLoad命令)し、アドレスを計算する(アドレス部は05なので05番地)。
6 制御装置は、解読した命令(Load命令)とアドレス(05番地)にしたがって実行します(即ち、次の(a)から(c)によって、05番地の内容をレジスタに入れます)。
(a) 制御装置は、バスに、05番地の内容をもってくるように指示します。
(b) バスは、05番地の内容(0001)を呼んで制御装置に渡します。
(c) 制御装置はバスから渡されたデータ(0001)を呼んで制御装置に渡します。
7 制御装置は、プログラムカウンタの内容(01)をアドレスとして、主記憶装置から命令を取り出すように、バスに指示します。
以下、同様に実行していきます。
(演習1)現実のコンピュータと比較して、どのような機能がたりないか調べてみましょう。
(演習2)演習2の結果を踏まえて、以下のような処理を行うプログラムをつくり、実行してみましょう。出来る限り簡潔なプログラムになるように工夫してみましょう。
「キーボードからデータを二つ読み込み、それらを加算して、ディスプレイに表示する」
(演習3)電卓とコンピュータとでは、何が違うのか考えてみましょう。