メモリの動的確保

投稿者名: 
yuya
ホストOS: 
Windows7
ゲストOS: 
Windows7
本文: 

ホストマシンのタスクマネージャーでメモリの使用率を確認すると、

ゲストマシンを起動した瞬間にそのゲストマシンに割り当てたメモリの分だけ上昇します。

 

その後、ゲストマシン自身のメモリ資料率を見ると、

割り当てられたメモリに対し、100%使用しているわけではありません。

 

ホストマシンのメモリ使用を押さえるために、ゲストマシンの実際の使用分だけ

メモリを使用するようにできないでしょうか?

メモリの動的確保といった点ではメモリバルーニング機能があります。
これは複数の仮想マシン同士で使用していないメモリを融通できる機能です。

しかしyuyaさんのやりたいような、ゲストマシンの使用分だけ、といったことはできません。

richi様

ご返信ありがとうございます。

>ゲストマシンの使用分だけ、ホストマシンのメモリ使用は不可

承知いたしました。

不要なゲストマシンの電源をこまめに落とすなどで対応します。

 

 

・・・と言いますのも、理屈の上では可能だからです。

 まず virtualBox や OS ではなく、Job の最小単位であるプログラムを考察します。
プログラムには実行コード部分とデータ、それと変数があり、プログラムがメモリーにロードされた時、これらを確保します。
と言うよりも、ロード自体がメモリーの確保に他ならない訳です。

 プログラムで可変長のデータを扱う場合、予め予測していたメモリーでは不足する場合があります。
この時に、改めてメモリーを確保する事になります。
シングル・タスクなら空いたメモリーを全て使い切る事は可能ですが、マルチタスク・マルチユーザーの場合は話が違ってきます。
実行コード用メモリー領域は一つでも良いのですが、ユーザー数分の変数領域が必要になり、しかも動的に確保する事になります。

 さて、「動的に確保」とは書きましたが、どこから確保するのでしょう?
出鱈目に確保すればメモリーが分断化され利用効率が悪くなるのでOSの機能を利用して確保します。
と言う事は、OSは全メモリーを把握する必要がある訳です。

 

 virtualBox を含む仮想マシンツールはホストOSから見て、異なるOSを単なるアプリとして起動させるツールと言えます。
上記では「OSは全メモリーを把握する必要がある」とも書きました。
つまり仮想マシンツールでOSを実行する事は、OSを単なるプログラムとして実行する事で、仮想OSでのプログラム実行はヒープからメモリーを確保するのに似ています。
仮想マシン・マネージャは仮想マシンのために動的にメモリーを確保していますが、そのメモリー自体は仮想マシンが管理する事になります。
当然、このままでは仮想マシンでホストのメモリーを動的に確保するなど不可能です。
そしてこれが virtualBox 仮想マシンが動的にメモリーを確保出来ない理由です。

 

 理由が分かれば対策も立てられます。
そもそも、仮想マシンで動作させるOSが予め与えられたメモリー全てを確保する仕様だったから動的に確保出来なかった訳です。
という事は、搭載メモリー量に依存しないOSであれば動的にメモリー確保が可能になるという事です。
現状、実際にそんなOSは存在しませんが、この様なOSがゲストならば virtualBox で動的なメモリ確保の必要性が生まれます。
そして そんなOSが実在すれば、その仕様を実現可能な仮想マシンが登場するであろうという事です。

 ところが、その仕様に似た機能は既に現実に存在します。
ページング・ファイルを用いた仮想記憶に対応したOSです。
これはまだメモリーの価格が高くOSで利用可能な最大メモリーを搭載出来ない時代、HDDをメインメモリーの代わりに利用するものでした。
現代では 32bit OS の上限とされる 4GB 以上のメモリーが比較的安価に入手可能です。
そのため 32bit OS では殆どメモリー不足にならず、ページング・ファイル無しでも運用が可能になりました。
またこの技術は、利用可能アドレスを拡張し大量にメモリーを消費するサーバーOSでは常識的に使われます。

 話は外れますが、 virtualBox と VMware の違いはご存知でしょうか?
仮想マシンのメモリー割り当て仕様の違いです。
virtualBox ではゲストOSのページング・ファイルを仮想HDD内に作ります。
このため、ゲストOSはページング・ファイルを利用せず、OSの上限いっぱいのメモリーを与えた方がパフォーマンスが良いのです。
一方 VMware ではホスト搭載の実メモリー以上に仮想マシンにメモリーを与えられます。
これはページング・ファイル機能をフルに活かした仕様でサーバ向けの仕様とも言えそうです。

 「メモリーを動的に確保する」という事に関して言えば、仮想OSのページング・ファイルをメモリー上に置くことがこれに相当するかもしれません。
つまり virtualBox の仕様として、ページングファイルを動的にメモリ上に展開する仕様に変更し、仮想OSに対して最小限のメモリーを与える設定にすれば実現可能という事です。

 ゲストOSはメモリー不足になると仮想記憶を利用します。
リアル・マシンでは HDDなどが利用されパフォーマンスが落ちますが、その機能を仮想マシン側で動的に確保したメモリーで置き換えてやる訳です。
多少のオーバーヘッドは否めませんが、それでも 仮想HDDでページングを行うよりパフォーマンスは向上する筈です。
事実、VMware ではページング・ファイルを専用ファイルに分離して管理していますので、仮想マシンにはホスト搭載のメモリー量よりも大きなメモリーを与える事が可能になっています。
この仕様も現実にはファイル操作を伴うのでパフォーマンスの低下は必至ですが、方法論としては正当だと思えます。
ましてデスクトップ用途だと、さらに進化させ、ページング・ファイルをメモリー上に展開する仕様にすればパフォーマンスの向上も期待できるでしょう。

 この様に、可能性はあるものの、それは現行OS以降、将来に向かっての仕様変更に他なりません。
ましてデスクトップでの仮想マシンの運用は現行または旧OSの運用に限られ、運用益も減る一方では、ここで紹介した仕様が実現するとは考え難いです。
方法論としては可能ですし、それは実現可能だとも言えますが、運用益上は現実的ではない事も確かです。
もし試したいのであれば、virtualBox はソースコードを公開していますので、それを拡張する形で実験的に実現は可能でしょう。

 やはり仮想マシンを運用するには、メモリーがふんだんに利用可能な環境が必要という事でしょうか。
どうしても…という話なら、仮想マシンより sandboxi のような特定タスク専用仮想化ツールもアリだとは思います。
その場合、タスク運用環境をどれだけ指定の実機に似せられるかが問題だとは思いますが。

 

コメントを追加

Filtered HTML

  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 使用できるHTMLタグ: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <br />
  • 行と段落は自動的に折り返されます。

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
CAPTCHA
スパム投稿防止の為以下のテキストを入力してください
Image CAPTCHA
Enter the characters shown in the image.