メモリーと言ってもいろいろあります。
PCでも最低3種類のメモリーが使われています。
- D-RAM : 一時的にデータを置き、常にリフレッシュが必要なメモリー。
- S-RAM : リフレッシュの必要が無いRAMで、バックアップ用途に使われる。
- ROM : 読み出し専用メモリー。電源が切れても内容を保持
最低でも…とは言いましたがS-RAMは使われていない事もあり、ハードウェアの仕様に依存します。
D-RAMは基本構造が最もシンプルで小型大容量化に向いています。
その構造とはコンデンサそのもので、コンデンサが1ビット当たり1個割り当てられ、
その両端の電圧で情報を記憶するものです。
コンデンサですから放電は付き物です。 そのため、情報を保持するために電圧の維持を行います。
具体的には、電圧が下がると情報が失われてしまうので、電圧の高い情報を再充電します。
これをリフレッシュと呼びます。
リフレッシュの周期は、実はPCの動作クロック数そのものです。(厳密には微妙に違いますが。)
当然の事ながら、電源が落ちると情報は失われてしまいます。
そのため、常にリフレッシュが行われています。
電圧として情報を蓄えているので、そう大きな電流(電力)は必要としませんが、
それでも常にリフレッシュが行われているために、結果として消費電力は大きくなります。
S-RAMは、その構造上、リフレッシュを必要とはしませんが、回路構成上D-RAMよりも小さくできません。
そのため、メインメモリーとしては使われず、後術するROMの代わりに使われます。
またリフレッシュを必要としない事から動作速度は一般的にD-RAMよりも高速です。
ROMはPC起動時に参照されるだけで、PC稼動時には使われません。
また、現実にはS-RAMから起動するので、非常事態でない限り使われません。
ROMの内容は「ブートローダー」や「BIOS」です。
PCは初回電源投入時にはROMから起動しますが、BIOS設定やブートデバイスの設定を変更すると
以降S-RAM起動となり、S-RAMに障害が出た時点のバックアップにように使われます。
また【読み出し専用】とは言っても再記入可能なものもあり、BIOSのアップデート時に書き換えたりします。
通常は書き換える事はありません。
特徴が分かったところで、実際の構成を見てみましょう。
メモリーチップは電子デバイスですから定まった仕様で作られます。
具体的には【バス幅】の規格です。
バス幅には アドレスバスとデータバスがあり、アドレスバスで読み書きする場所を指定します。
そして指定の場所にデータバスを通して読み書きがなされます。
【アドレス】に付きましては、メモリー以外でも使う単語ですので覚えておくと良いでしょう。
このデータバス幅とは、一度にアクセスできるデータ単位なのです。
そしてアドレスバス幅とはメモリーの大きさで決まるデータ保持場所を指定する大きさなのです。
CPUが64ビットであれ、8ビットであれ、メモリチップそのものの標準規格は8ビットなのです。
64ビット単位でアクセスするには、同じチップを8個同時にアクセスして、メモリモジュール単位で
64ビットアクセスを実現したります。
もちろん16ビットや32ビットのメモリーチップも存在します。
要はメモリのどの場所をアクセスするのかを決める【アドレス】と、
1アクセス当たり取り出せるビット量がバス幅であると言うことなのです。
64ビットCPUだからと言ってメモリーのバスサイズは64ビットでなくても良いわけです。
CPUとの関係はメモリコントローラというデバイスが担当し、
メモリーの基本バスサイズは8ビットだという事ですね。
ハードウェアの話はここまでにします。 このカテゴリはソフトウェアですから。
ソフトウェア側から見ると、重要なのはアドレスとデータサイズなのです。
もちろんメモリーのサイズも重要ですが、
ハードウェア絡みの話になりますので、ここでは省略します。
なぜアドレスが大切かという事なのですが、
それはどこにデータがあるかを示す重要なカギだからです。
CPUで扱う事ができるのはアドレス幅で決まる範囲の整数のみなのです。
(実数に付きましては 別の章で)
そして、CPU内部のレジスタではアドレス(データの有りか)を頻繁に使います。
ここで重要なのは アドレスはデータではない という事なのです。
データの場所を示す数値なのです。
数値だからこそCPUが扱えるのですが、それはメモリー上のデータの位置を示すもので、
データそのものではないという事なのです。
そしてそれこそが【ポインタ】の概念なのです。(ポインタは以降の章で解説します。)
位置を覚えておくためにメモリ上にアドレスを保存する事はありますが、
その内容はデータの位置を指し示すものであって、処理すべきデータそのものではないのです。
この点だけはしっかり覚えておく必要があります。
C系プログラミング言語では「ポインタ」が利用可能ですが、
それがアドレスそのものであって、データの場所を示す数値であるという事です。
このポインタの概念が理解できないとC系言語はマスターできません。
ポインタと言うのはこのようにハードウェアに密接に関係しているため、
使い方を誤ると暴走したりフリーズしたりします。
他の処理系言語では暴走などありえません。 それはポインタを扱わないからです。
C系言語は一見高級言語のように見えますが、実は非常に低レベルな処理を書ける
高級アセンブラと言ったところでしょうか。
また、C系言語で変数に型が存在するのは、メモリの使用する範囲を決めているからです。
高級言語では型の制約が少ないのに対し、C系言語では型指定を行うのは、
実はメモリ構造からの制約だったのです。
という訳で、ソフトウェア側から見たメモリーはアドレスとデータサイズが最も重要である事が
お判り頂けたと思います。
他の言語でも変数型を宣言するものがありますが、C系よりは制限が緩いのは
アドレスやポインタという概念を意識させない仕様だったからです。
メモリを直接扱うC系言語の特徴を掴むには、
そういう意味でメモリーの構造を知るべきだったのです。