本物のC

C の前に:コンピュータ


コンピュータを成すもの

コンピュータは大雑把に言って

の三要素から成ります。

コンピュータの構成

デバイスとはマウス、キーボード、モニタ、HDD(ハードディスク・ドライブ)等々の、外界とのやり取りを担う機器です。デバイスは CPU へ接続されています。

メモリとはデータを一時的に憶えさせておく機器で、これも CPU へ接続されています。メモリは HDD の類と異なり、電源を切ればデータは全て消えます。容量の点でも HDD より劣りますが、アクセス(読み書き)は HDD より圧倒的に速くなっています。

CPU はメモリに書かれた命令を実行していく機械です。CPU 自体も、少しデータを憶える事ができるレジスタ(register)を持っており、命令は

等という感じになっています。

メモリについて

まずメモリについてもう少し詳しく見ます。

デジタルデータは全て 0 と 1 の並びで表現できるので、メモリも 0 か 1 かどちらかの状態を取るビット(bit)の集まりだと言えます。ビットは基本的に 8 ビットを 1 バイト(byte)として纏めて扱います。(「扱う」とは、CPUがメモリから読み書きする場合の最小単位とかになっているとかいう事です。昔は 8 ビット以外の数をバイトとしたアーキテクチャもあった様です。)

1 バイトの半分、4 ビットを考えると 24 = 16 通りの値があるので、1 バイトは丁度 2 桁の十六進数で表されます。

ビット列 十進数 十六進数
0000 0 0x0
0001 1 0x1
0010 2 0x2
0011 3 0x3
0100 4 0x4
0101 5 0x5
0110 6 0x6
0111 7 0x7
1000 8 0x8
1001 9 0x9
1010 10 0xA
1011 11 0xB
1100 12 0xC
1101 13 0xD
1110 14 0xE
1111 15 0xF

0x はその数が十六進数である事を示しています。例えば 11 は十進法ならばそのまま 11 ですが、十六進法では 0x11 = 17 という風に実際の数が変わるので、何進法かをはっきりさせる必要があります。

さてそうすると、メモリを 1 バイト毎に区切って書けば

アドレス
0x0000 0x00
0x0001 0x00
0x0002 0x00
: :

となります。これがメモリの基本的なイメージです。

(OS には、メモリが足りなくなった場合に HDD 等の領域で代用するスワップなる機能がありますが、さっき書いた通り HDD 等は猛烈に遅いので、一度メモリ不足になってしまうとアクセスランプが点滅すると共に動作がかなり重くなります。)

CPU について

CPU はプログラムカウンタ(program counter、PC)と呼ばれるレジスタを持っていて、ここに次はメモリ上どのアドレスの命令を実行するかを書いています。これは CPU が自分の為に使うレジスタの一つです。

一方で CPU を使う側の為のレジスタとしては AL、CL、DL、BL 等があり、これらを用いて計算を行ったりする事ができます。

例えば、プログラムカウンタの指す位置とメモリが

PC アドレス
: :
0x4000 0x04
0x4001 0x0A
0x4002 0xEB
: :

となっている状況を考えます。(命令セットは x86 とします。)

0x04 は「次の値を AL レジスタに足す」という意味を持ち、0x4001 の値と併せて 0x04 0x0A で一つの命令になります。これを実行する事でプログラムカウンタは 0x4002 へ移り、AL レジスタの値には 0x0A = 10 が足されます。

この様にして、CPU はメモリ上の命令を順次実行していきます。(この辺りのイメージは「C の前に:チューリング機械*」を読むと明確になるかも知れません。)

プログラム(program)とはこうした命令の並び(へと変換されるもの)であると言えます。CPU への命令を直接書いたものは特に機械語(machine code)と呼ばれます。

アクセス速度*

データを記録するものが色々ありますが、

レジスタ メモリ HDD
アクセス速度 超速い 速い 遅い
一般的な容量 数バイト 数ギガバイト 数テラバイト

という様に、CPU から離れるほど低速な代わりに大容量になっています。

一般に CPU はレジスタの他、数メガバイト程度を一時的に記録できるキャッシュ(cache)も持っており、レジスタと同等か若干遅い程度の速度でアクセスできます。

HDD は名前の通り円盤を物理的に回しているので、それなりに(具体的には数十ミリ秒の単位で)時間が掛かります。一方で最近普及してきた SSD(ソリッド・ステート・ドライブ)は完全に電気的な記録方式であり、HDD よりもかなり速くアクセスできます(レイテンシで数百倍、スループットで数倍)。この差は SSD に OS を入れたりするとはっきり体感する事ができます。