メモリアドレス 【memory address】
コンピュータのCPUはメモリ上に格納されたプログラムから命令を一つずつ読み込み、指定されたメモリ上の位置にあるデータを読み込んで演算を行い、指定の位置に格納する。これら一連の動作の中で、命令やデータを読み込むメモリ上の位置を表す値のことをメモリアドレスという。
メモリ装置には1ビットのデータ(「0」または「1」の2進数の値)を格納できる記憶素子が並んでいるが、1ビット単位でアクセスするのは効率が悪いため、「ワード」と呼ばれるある程度の長さのビット列を一つの単位としてアクセスする。現代のほとんどのコンピュータでは1ワードは8ビット(1バイト)であり、バイト単位でデータの出し入れを行う。
メモリアドレスはメモリ装置先頭からのバイト数で表される。一度にどのくらいの広さのアドレスを指し示すことができるかはコンピュータ内部の伝送路であるバスが一度に転送できるビット数(バス幅)と、CPU内部の一時的な記憶装置であるレジスタのビット数によって決まる。
例えば、バス幅32ビットの32ビットCPUの場合は、メモリアドレスとして0から232-1までの値を指定することができ、232バイト(4GiB)までのメモリ空間にアクセスすることができる。バス幅64ビットの64ビットCPUの場合は0~264-1であり、264バイト(16EiB)までの広大な空間を利用できる。
物理アドレスと論理アドレス
現代のコンピュータおよびオペレーティングシステム(OS)では「仮想メモリ」という仕組みが組み込まれており、ほとんどのコンピュータプログラムはメモリ装置の物理的な位置(物理アドレス)によってメモリアドレスを指定することはない。
代わりに、OSが設定した論理的なメモリ空間上における先頭から位置(論理アドレス)を指定するようになっており、物理アドレスとの対応関係はOSおよびCPU内部のメモリ管理ユニット(MMU:Memory Management Unit)によって管理される。これにより、物理的なメモリ容量を超えるメモリ空間を確保し、物理メモリに収まりきらない部分をストレージ上に確保することができる。
ストレージ上に確保した領域はメモリとして直接アクセスすることはできないため、実際に読み書きが必要になったらその時使っていない物理メモリ領域との入れ替えが行われる。この操作を「スワップ」(swap)あるいは「ページング」(paging)と呼び、OSが自動的に行うため利用者やアプリケーションは意識しなくてよい。