CPUとOSのビット数

CPUが8ビットだとメモリ空間の最大は「2^8=256バイト」となります。つまり、CPUの整数域が0から255までしかアドレスできないわけです。それはレジスタのサイズによって決まります。レジスタのサイズも8ビットですから、0から255までのアドレスに対応した最大256までの値を参照して加減乗除することになります。

0をいれて255までの値を超える演算をする場合は複数のアドレスを使って、実数演算をすることになります。これは非常に遅くなります。

出始めのパソコンは8ビットでしたが、やおら16ビットのパソコン、NECでいうなら「PC-9801」が登場したことでメモリ領域が「2^16=65,536バイト」となりました。これとて、整数域を超えるとがぜん遅くなったもので、可能な限り整数化して演算するような工夫をしなければなりませんでした。

32ビットのCPUが登場することでメモリ領域と整数域が「2^32=4,294,967,296バイト」と16ビットに比べると考えられないような値になったと感じられました。

これは一般的には「4GB」と言われる値ですが、現実には32ビットOSで使えるメモリーの領域は3Gでした。理論的な制約ではなくハード的な制約だったそうです。

CPUは起動時にIOをチェックしに行きますが、そのIOの情報をメモリー領域を使用して管理すために制約を設けたという話がありましたが、事実関係は知りません。32ビットOS(Windows)は3GBのメモリしか認識しなかったのは事実です。

直近のOSは64ビットが主流ですのでアプリケーションが64ビット対応でしたら整数域は「2^64=18,446,744,073,709,600,000バイト」となり、18エクサと言う広大なメモリー空間を使用することも可能になりました。ただし、それだけもメモリーを実装すればの話ですが。

実際に64ビットのCPUが64ビットのレジスタで演算しているのかは、そこまでは知らないのですが、もしそうなら通常の演算は全て整数で行って演算結果から実数にすれば、速度も誤差も最小にすることができるのではないでしょうか。

メモリー領域がオーバーするようだと、アプリケーションが対応していればハードディスクやSSDを仮想的にメモリーの延長として利用することもしますが遅くなります。仮想的に退避することが組み込まれていなければそこでアプリが落ちます。

OSを立ち上げるだけで、あれやこれやがメモリーを使いますので、何かを動かす前に「5GB」は使われてしまうと考えて置くことが望まれる時代になりました。

ちなみにOfficeのWordやExcelも基本的には64ビットになりましたが、互換性の為なのだと思いますが、実態は32ビットとさして変わりがありません。

Excelの最大行数は、かつて「65,536行」でしたが、32ビット以降「1,048,576行」の20ビットを限界としています。横方向(列)はXFDで「2^14乗」の「16,384列」を限界としています。つまり、セルの数の上限は「2^34乗」となりざっと17GBとなりますが、Excelは値を持つ配列と書式を持つ配列があるので、実際には仮想メモリを使わないとすべてのセルに値を持たせることは難しそうです。

試す価値がないので今はチャレンジしませんが、マイクロソフトではテストしているのだと思います。100万行読み込むだけでも、かなりの時間がかかりそうです。

前の記事

MicroSoft Defenderに変える

次の記事

パソコンとメモリの話