C の前に:コンピュータ
コンピュータを成すもの
コンピュータは大雑把に言って
- CPU(Central Processing Unit:中央処理装置)
- メモリ(memory)
- デバイス(device)
の三要素から成ります。
デバイスとはマウス、キーボード、モニタ、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 を入れたりするとはっきり体感する事ができます。