2ntブログ

32ビットOSのメモリ制限はなぜ存在するのか?

32ビット版Windowsはなぜ4GB以上のメモリを積んでも使えないのか?
なぜ1アプリケーションにつき最大2GBまでしかメモリを使う事を許してないのか?
仮想メモリは何のためにあるのか?
というお話。

まずコンピュータの核であるCPUは、全ての計算処理を2進数で行っています。
電気が流れなかったら0、流れたら1という0と1しかない世界です。
ただこのままでは2以上の数値を扱えませんので、桁を増やして対応しています。
我々が日常で使っている10進数も、実は0~9までしか数字の種類はありません。
10以上の数値を表す場合は、2桁以上にして表記しています。
これと同じように2進数も2以上の数値は桁を増やせば表せるって事です。
つまりビットとは桁の事です。
32ビットOSあるいは32ビットCPUと言ったら、最短で処理できる数値が2進数32桁分って事です。
2進数32桁で表せる数値は、0~4,294,967,295です。
この4,294,967,295が、メモリで言うところの4GBになるわけです。
CPUは、今現在メモリのどの部分にある命令を実行しているかというのをプログラム・カウンタという内部メモリに記憶しています。
このプログラム・カウンタはOSやCPUのビット数と同じなので、32ビットOSやCPUはメモリを4GBまでしか使えないのです。
もっと増やせよwwwと思うかも知れませんが、この仕様ができた当時は4GBものメモリは大容量であり、それ以上必要になることはまずないだろうって考えられていたからです。
そもそも昔のパソコンやファミコンは、メインメモリの容量は1MBも無いんですよ。
それでもゲームが動いてたわけです。
4GBとか、そんなにメモリ使うプログラムとかシステムとか考えられなかったんですね。
今は64ビットOSがあり、32ビット版Windows使ってても、よほど古いパソコンじゃなきゃ、CPUは64ビットです。
ですがたぶん数年後なのか数十年後なのか、あるいは数百年後には「たりねーよwww」って話になってると思います。

さて4GBという限られたメモリでWindowsとアプリケーションの両方を動かさなければなりません。
Windowsは結構メモリを食うシステムなので最大で2GBメモリを使います。
なのでアプリケーションは残りの2GB以内で動くように作ってねってなってるわけです。
仮に超メモリ使わないOSだったとしても、32ビットである限りは4GB以上のメモリはどちらにしろCPUが処理できませんから。

でもこれだと何かのアプリケーションが2GBギリギリ使ってしまったら、もう他のアプリケーションは起動できなくなってしまいます。
マルチタスクOSってのは同時にいくつものアプリケーションが起動できるのが売りなので、これでは困ります。
そこで登場したのが「仮想メモリ」です。
OSやCPUがマルチタスク・マルチコアになったとは言っても、基本的に実行できるプログラムは1つだけです。
同時に複数動いているように見えますが、あれは複数のプログラムをちょっとづつ実行しては一旦停止して、別のプログラムを実行みたいな事をやってるからです。
また、キーボードやマウスからの入力が無い、アクティブウィンドではない(一番オモテにある窓じゃない、あるいは最小化されている)アプリケーションは、プログラムが動いていても待ち状態で特に計算する事が無い場合があります。
あるいは計算処理をそんなに急いでやらなくても良い場合が多いです。
なのでそういったアクティブではないプログラムが使ってるメモリをいったんHDDに移して、今最優先で処理しなければならないプログラムにメインメモリを使わせる。
そのためにの「仮想メモリ」です。
「仮想メモリ」をメモリの最大値を増やすものと勘違いしている人が多いですが、メモリが増えるのではなく、「同時に起動できるアプリケーションの数」を増やすための仕組みなんです。

また「仮想」メモリですから、動作が非常に遅くなります。
コンピュータはHDDから直接読み出したプログラムをメモリに置かずに実行して、またHDDに記録し直すなんて事はできません。
CPUがアクセスできるのはあくまで「物理メモリ」だけです。
優先度が低いメモリの内容をHDDに書き出して、必要な時にまたメモリに読み直しているのは「チップセット」と呼ばれる外部とのデータのやり取りを制御する別の部品です。
それにHDDはメモリに比べて極端に読み書きのスピードが遅いです。

現在のコンピュータを使ったシステムの中核となるのはデータベースですが、このデータベースというシステムはいちいちHDDが読み出してプログラムにデータを渡して、終わったら更新されたデータをHDDに書き込むなんて事を逐一やってません。
なぜならそんな事をしていたら遅くて使い物にならないからです。
アプリケーションサーバなど計算処理を担当するコンピュータはCPUを高速なものにしたり、複数のCPUを載せたりする事で処理スピードを上げますが、データベースサーバの処理スピードを上げる時は通常はメモリを増やします。

ネットゲームで「巻き戻り」と言われる現象が起きるのも、このデータベースの仕様によるものです。
ネットゲームでは非常に膨大なデータの書き換えが頻繁に行われます。
プレイヤーのHP/MPの値とか、今いるMAPの座標とか、アイテムとかスキルのCD(クールダウン 次にそのスキルを使えるようになるまでの時間)とか、とにかく他の業務システムの比じゃないほどデータの読み出し、書き換えが行われています。
そんなものを、いちいち律儀にHDDから読み込んで書き込んでなんてしていたら、とてもじゃないけどリアルタイムでゲームが動きません。
ラグとかスペック不足でカクカクになるとか、そんなレベルじゃないものになります。
なのでそれらは全てデータベースサーバのメモリ上で行い、一定の間隔で現在の状態をHDDに書き込むのです。
それゆえにサーバがダウンしてしまうと、メモリ上にあった最新データが失われてしまうので、前回書き込んだ時点のデータに戻ってしまうのです。

ウルティマ・オンラインという昔のMMOのサーバプログラムが「神レベル」と言われるのは、今のMMOよりはるかに多くのデータを持ちながら、今のサーバよりはるかに低い性能でラグらずに行えていたからでしょう。
ToSを作った人達は見習って下さいねw
ROの時代からどんだけ開発してるんですか?w
ネクソンさん、あなた方どんだけ昔からネットゲームの運営してるんですか?

コメントの投稿

非公開コメント

カウンタ
プロフィール

ウホッ!いい男

Author:ウホッ!いい男
異世界転生を待ち続ける中高年のおっさん

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR