2ntブログ

32bit(ビット)OSのメモリ制限について

LoVAのクローズβのクライアントが、前回のα2テストの時より糞になっていて、私の環境では1試合するごとに再起動しないと「Run out of video memory・・・」なるエラーを吐いて落ちていました。
エラーメッセージを単純に解釈すれば、ビデオメモリが足りないのが原因に思われますが、実はこれ違います。
私はデスクトップPCですので、安いノートPCのようにメインメモリの一部をビデオメモリとして使ったりせず、きちんとビデオカード上に2GBもの専用メモリがあります。
にも関わらず出るのは、「メインメモリ」が原因です。

32bitOSにはメモリに4GBの壁というのがあります。
この4GB壁というのは何か?
これを理解するにはまずCPUがどのようにメモリを管理しているかの仕組みを理解すると、なるほどとなります。
今回はメモリ関係のウンチクを。


1.内部メモリ

メモリと言えば通常はマザーボード上に刺す増やしたり取り替えたりできる「メインメモリ」の事ですね。
パソコンのカタログの性能一覧のとこに載ってる「メモリ 4GB」とか書いてあるやつです。
市販のExcelなどのビジネスソフトやゲームソフトの動作条件のとこに書いてある、「○GB以上のメモリ(が無いと動きませんよ)」とかってのもそうです。

実はこれ正確には「外部メモリ」と言い、それに対して「内部メモリ」と呼ばれるものがコンピュータにはあります。
「内部メモリ」とはその名から想像できる通り、CPU内部のメモリです。
CPUの仕様なんかを見ると1次キャッシュ○MB 2次キャッシュ○MBというのが書いてあるかと思いますが、ここで言う「内部メモリ」はこれの事ではありません。
このCPU内部にキャッシュメモリを搭載して、より処理スピードを上げるという仕様ができる以前の、古いCPUの時代からある「内部メモリ」を指します。


2.レジスタ

この「内部メモリ」は、プログラムの世界では「レジスタ」と呼ばれます。
「レジスタ」はCPUが使うメモ帳のようなものです。
人間が何桁もある計算をする時にノートに筆算するのと同じように、CPUもこのレジスタを使って計算したりしてます。

また、「今メモリの何番地に書かれているプログラム(命令)を実行しているのか?」とか「計算の結果、桁があふれた(オーバーフロー)」とか、「マイナスの数値になった」とか、「丁度0になった」というのも、このレジスタに記憶します。
前者のプログラムの実行番地を示すレジスタを「PC(プログラム・カウンタ)」、後者の計算の結果の属性を示すレジスタを「フラグ・レジスタ」などと呼び、これらは基本的にプログラムでいじる事はできません。
「PC」とか自由にいじれたら、プログラムの実行番地が変わってしまって順序が狂って変な動作をしたり、最悪の場合バグって止まって(フリーズ)してしまいますからね。
この事からも分かるように、プログラムによって自由に書き換えが可能な「外部メモリ」に記憶しておいたらシャレにならないものもあるので、内部メモリが必要なんです。


3.PC(プログラム・カウンタ)と搭載メモリの制限

プログラムの実行番地を示す「PC(プログラム・カウンタ)」ですが、「内部メモリ」の一種なので当然無制限ではありません。
この「PC」も含め、レジスタ類はすべてCPUのbit数を上限とした数値しか扱えない容量しかありません。
32bitCPUであれば、2進数32桁分、64bitCPUであれば2進数64桁分です。
2進数32桁で表せる整数は0~4,294,967,296までです。
だから32bitCPUは4GBまでのメモリしか搭載できないんです。
だから32bitCPUでも動くように作られた32bit版OSは、64bitCPUを搭載してメモリも8GBとか沢山積んだパソコンで動かしても、4GBのメモリまでしか扱えないんです。
仕様上は最大で64GBまでメモリ積めるパソコンでも、OSが32bit版だと4GB以上積んでも無意味だよって言われるのはその為です。


4.32bit版Windowsの2GB制限

32bitOSは4GBまでメモリは扱えるので、OSが動作に使ってる部分を差し引いた残りの3GB以上のメモリはプログラムで自由に使えるかっていうと、実は使えませんw
プログラム1つが自由に使えるメモリの最大値は2GBに制限されてます。
つまりExcelが自由に使えるメモリは2GBまでなので、それ以上の大きなデータを扱う場合は、Excelはその都度古い使ってないデータを消してメモリを空けて、そこへHDDから新たに必要になった部分だけを読み出すという事をしなければならないって事です。

なおWindowsには「仮想メモリ」と呼ばれる、HDD上に仮メモリを作って4GB以上のメモリが必要になっても動ける仕組みがあります。
しかしこれは例えば2GB使うアプリケーションを2つ以上起動できるようになるだけで、アプリケーション単体で使えるメモリが増えるわけじゃありません。

この2GB制限を以外と知らない低レベルプログラマが多いです。
多くの32bit版の開発言語は、そうならないように、あるいはそういうプログラムが書かれたら、エラーを出すようになっていると思いますが、そうじゃないのもあるし、完璧にミスを検知できない事もあります。
なにより「メモリ管理はプログラマ自身がやらなければならない」と言われているC言語系は、開発ツールにそれらを検知して警告する機能すら無いと思います。
だから「メモリが足りません」みたいなエラーが出て、「あれ~?おっかしいな。タスクマネージャで見ると空きメモリあるのになー。」とかって悩むプログラマが多いし、そういう不具合のあるアプリケーションが多いんです、Cで作れらたものはw


5.2GB制限を回避する3GBスイッチ

使っているアプリケーションがこういった不具合を抱えている場合、ユーザー側で直す事は当たり前ですができませんので、開発元や開発者が不具合を直したアップデート版や修正プログラムを作ってくれるのを待つしかありません。
しかしアホな開発元や開発者だと、いつまで待っても直らない事もよくあります。
そういった場合はそのアプリケーションを使う事を諦めるか、エラーを我慢して使い続けるしかないのかというと、実は1つだけ解決方法があります。

Windowsには裏技というか、通常はいじれない設定やオプションがいくつかあるのですが、その中にこの2GBの制限値を変えられるものが存在しています。
起動スイッチと呼ばれる、Windowsをどういう設定で動かすかを指定するオプションの一種です。
やり方等は詳しく述べませんので、「3GB」「スイッチ」「Windows」等でググって下さいw

Windows自体は通常2GBもメモリを使ってません。
もちろん2GBギリギリ使う事もあり得る、そのぐらいメモリを確保しておかないと安定動作しないとマイクロソフトが判断したから、Windowsに2GB、アプリケーションに2GBという仕様というか設定にしてあるわけです。
ですからこれらの設定を安易に変えるのは、場合によっては動作に支障をきたす事もありますし、4GBすべてをアプリケーションが自由に使えるような設定にしたら、そもそもWindowsが動かなくなります。
ただ先にも述べたように、よほどの事がない限りWindowsは500MB程度しかメモリを使ってません。
なので安全を見越してその2倍の1GBをWindowsに割り当て、残りの3GBをアプリケーションが使えるようにする。
これが通称「3GBスイッチ」とか呼ばれているWindowsの裏技です。

「メモリが足りない」系のエラーで落ちるアプリケーションは、大抵これで落ちなくなります。
本当に足りない場合もありますが、大体は2GB制限にぎりぎり引っ掛かってWindowsに「おい、決まり守れや!」と落とされているだけなので、解決しますw

件の「LoVA」のクローズβバージョンの糞クライアントも、これで落ちなくなりますので、同じお悩みを抱えている人は自己責任でどうぞ。

なお自己責任とは言っても、Windowsがこれによって起動しなくなったり、壊れたりする事はありません。
不都合が生じたら元の設定に戻す事も簡単にできますので、免罪符の決まり文句程度に思って頂ければいいですw

コメントの投稿

非公開コメント

カウンタ
プロフィール

ウホッ!いい男

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

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

この人とブロともになる

QRコード
QR