3GB と USERVA
R says:
・なぜ‘/3GB’スイッチを外したらモルザのEQ2の機嫌が良くなったのか?気になって多少調べてみた事について,勝手な解釈,憶測,想像,自己完結に基づいて書いてみました.
ただし,私は本職のプログラマでもエンジニアでもSEでも何でもありません.最低限一通り Windows のおもりが出来ること,趣味の範囲ほどならCがある程度は書けるってぐらいの知識しかありません.
そのことを前提にして,嘘か本当か分からない話に興味のある方だけご覧下さい.
なお,あくまでR個人の見解でありますので,この件でモルザに突っ込んだりはしないでやってください.
※あまりに乱雑な文章であったため 07/25 に加筆修正※
・Microsoft を色々つついてみましたが‘/3GB’スイッチも‘/USERVA’スイッチも,突き詰めていけば“Windows Server”に行き着きます.ま,どうしてなのかは後回しにして・・・
その項目に同じくして以下のような文章があります.
/userva=xxxx スイッチは、2 GB 以上のユーザー モード領域が必要であるものの、/3GB チューニング スイッチによって提供されるすべての領域は必要でない場合に、プログラムの製造元がユーザー モード アドレス領域をより細かくチューニングするために設計されています。
注 : /3GB スイッチのみを使用すると、カーネル モード領域に 1 GB、ユーザー モード領域に 3 GB がそれぞれ割り当てられます。
(Microsoftオンラインサポートより抜粋)
つまり‘/3GB’を設定するとこうなります.
プロセス管理やメモリ管理など色々な役割がありますが,基本的にOS自身が使うエリアとなる“カーネル部分に 1 GB”と,プログラムを走らせるなどユーザーが自由に使える“ユーザー部分に 3 GB”が設定されます.
同時に大量のプロセス,サービス,複雑なメモリ管理をさせるため,カーネルにもっと容量が欲しいといった下記のような場合に出てくるのが‘/USERVA=xxxx’です.
xxxxに与える数値の範囲は 3030 ~ 2000.単位はMB. 例えば‘/USERVA=2675’と設定した場合だと
3075MB(定数) - 2675MB = 400MB
となり,ユーザーから400MBを切り取って,カーネルへ継ぎ足す事になります.ですから‘/USERVA’でチューニングというのは 4 GB のメモリを,どちらにどれだけ割り振れば一番効率の良い処理をさせられるかを行うことなのです.
・以上のように 4 GB‘未満’でも,4 GB‘超’のどちらでもなく,純然たる『4 GB のメモリーをどういう風に割り振るか』と言う設定を行うのが‘/3GB’,‘/USERVA’の役割であり,決して…私も勘違いしてましたが… 3 GB 以上のメモリを搭載していることを明示(宣言)するためのものではありません.
※これ以降は間違った解釈であるとご指摘を頂きました. 予めそれを含めて読み進めてください(8月6日)※※
さてと・・・
ってことはです.どう転んでも‘3 GB’しか認識できない 32bit版 Windows XP では一体どういう事になるのか? 4 GB と同様に作用すると仮定すると,大まかに二つのケースが考えられると思います.
【A】 : 「カーネルに優先して 1GB 確保する」
【B】 : 「ユーザーに優先して 3GB 確保する」
・まず【A】の場合だと,下図のようにユーザーモード部分に所在不明の1GBが発生することになります.
現在でも足りないメモリ部分はPF(ページファイル)を使いますから,同様にそうしているのかもしれません.この場合ただでさえPFを使おうとしてオンメモリに置きたがらない Windows は,通常のスワップ処理に加えて『常時仮想 1 GB をスワップしまくってる』って事になります.なぜならラージメモリに対応したプログラムは,オンメモリ 2GB を越えて遠慮無くメモリを使おうとするからに他なりません.
・次にカーネルよりもユーザーへ優先的に 3GB を確保する【B】の場合.
細かなことを言えばモルザマシンに4GB(2GBx2)を実装した場合,タスクマネージャを見るとおよそ 3145MB が認識されています.1GB = 1024MB と古典的な考え方をして,3GBスイッチが確保するメモリが 1024 x 3 = 3072MB とするなら,差し引きおよそ 73MB がカーネルとなります.アイドル状態の OS(XP) 自身が使用するメモリ量がおよそ 256MB 程度と言われていますから,これじゃあとてもじゃありませんが足りません.
USERVA=2892 としてユーザーから 183MB 差し戻してカーネルの合計が 256MB.これが運用する最低ラインあたりでしょうか? これならよく見かける「USERVA=2900 辺りが良い」とされているのも納得の数値です.
その一方で私(R)が使っているPCでは,およそ*3406MB が認識されています.両者はメモリの生産・製造メーカーが違いますので,モジュール容量の差が認識量の違いとなっているのでしょうか? まま,これを同じ条件で計算するとデフォルトで 334MB がカーネルに割り振られるような格好になり,これならまだ何とかなるかなぁ?って感じです.
*:認識されているだけで実際に利用可能であるかは不明.
・とまぁ,以上のような【A】【B】二つのケースが考えられます.おそらく【B】のような動作をしていると思いますが,限られたプログラムを淡々と走らせ続けるワークステーションや小規模なサーバー若しくは,それこそEQ2専用マシンとして割り切ってチューニングするといった特殊な用途ならいざ知らず,一般的な運用形態においては
『‘/3GB’を設定すること自体が無意味ではないか?』
そこまで乱暴には言わなくとも,設定したところでさしたる恩恵は得られない様に思いますし,仮に【A】の動作をしているならなおさら意味がないという…むろん「私の立てた仮説が正解ならば」という条件付き…結論です.
・あ,そうそう. Microsoft で“Windows Server”に行き着いたのは,Windows Server 2003 standard なら 32bit 版でもネイティブに 4GB に対応しているからなんですよね.まぁいまさら入手は出来ないでしょうし,できたとしても用途が違うのでEQ2は動かないでしょうけどね.ま,扱ったことは無いので断言は出来ませんが...
以上!
| 固定リンク
この記事へのコメントは終了しました。
コメント
これは分かり易い!
この辺MSの説明がコアな開発者の人は分かるけど、
トウシロな私にはさっぱりだったので助かりました
感触としてはUSERVAでカーネル用のメモリを1GB遥かに割って設定できてるようでした。
……EQII一時停止頻発しましたがw
投稿: ハム | 2009年7月15日 (水) 20時46分
実際にどこまでが合っているか間違っているのか,書いている本人にもさっぱり分かりません.絶対に鵜呑みにしないようお願いします.
と投げやり(゚ω゚ )
投稿: R | 2009年7月16日 (木) 11時50分
物理メモリと仮想メモリを混同している典型例です
カーネル自身も仮想メモリ空間で動きます
はっきり言えば3つ目の図以降全部間違ってます
投稿: 通りすがり | 2009年8月 6日 (木) 18時30分
はっはっは,やはり間違っていましたか.いやはやお恥ずかしい限りです.
しかし仮想メモリであれ,物理メモリであれ,おなじ動作をするなら不都合が出ようはずもないと思いますが・・・と,私のような素人と議論…というほどのことも出来ないと思いますが…したところで話のかみ合おうはずもありませんので,この手の話を進めることは大いに好きですがここは素直に自分の知識のなさを認めて止めておきます.
どうやらこの辺り事情に明るい方とお見受けします.興味のある方も多数居られよう思いますので,向学のために実際にはどういう動作をしているのか? お暇なときにでもご教示いただければ幸いです. その際には改めて該当記事の削除や訂正などしようと思います.
投稿: R | 2009年8月 6日 (木) 20時04分
別の素人です。
下記が参考になるでしょう。
「Windows は、システムに搭載されている物理メモリの容量にかかわらず 4 GB の仮想アドレス スペースを使用し、アプリケーションなどのユーザー モード プロセスに 2 GB を割り当て、オペレーティング システムやカーネル モードのドライバなどのカーネル モード プロセスに 2 GB を割り当てます。」
↓参考URL
http://technet.microsoft.com/ja-jp/library/aa996456%28EXCHG.80%29.aspx
モルザさんの基本概念そのものは間違ってないし、参考になる記事です。
投稿: gamebakari | 2010年8月 3日 (火) 23時41分
gamebakari殿
恐れ入ります.
・もともと一般用途のOSを想定しているものではなく,たまたまXPでもそのように使えますよ.といった感じでしょうか.
ままいずれにせよ,大容量メモリーが使いたいと言うのなら,32ビットOSじゃないと困る(8ビットや16ビットのDOSプログラムが使いたい等の)様なよほどの理由がない限り,64ビットOSへ移行した方が良いでしょう. 少なくともスイッチ一つで悩まなくてすむぶん幸せになれます.
※文章を書いたのはモルザではなく「R」です.
投稿: R | 2010年8月 4日 (水) 09時46分