【大容量RAMでも必須】メモリに優しく!仮想メモリの設定の仕方

この記事の概要を簡単まとめ!

  • 仮想メモリは殆どのOSに搭載されるシステム
  • しばしば設定論議が巻き起こる話題
  • 過去の実体験から起きた「RAM占有」状態
  • たとえRAMが大容量でも設定は必須
  • RAM・仮想メモリ関係のツールを紹介

PCの設定の話題は、多くの人が最適解を求めてインターネット上の様々に入り乱れた情報の中から、確実と思われる複数の情報を比較して最終的に1つに絞るパターンが多い。

その中でも仮想メモリは、前ブログの人気記事として訪問回数が多かった。そのため、WordPressに移行した今、ここで今一度、仮想メモリの設定について、リンクス岐部が実体験を元に解説していく。

殆どのOSに搭載されるシステム:仮想メモリ

仮想メモリの基本

PCに詳しい人であれば説明するまでもないのだが、検索してたどり着く人は殆どが初心者で言葉の意味や機能が分からない人が多い。そのため、仮想メモリとその周辺のことについておさらいをする。知っている人は目次から読みたいところまで飛ばしてほしい。

前提:メモリ(RAM)とは?

仮想メモリを説明する前に、物理メモリ、通称RAMについて解説する。RAM1)Random Access Memory: 直訳すれば「無作為アクセス記憶媒体(装置)」、分かりやすく言い換えれば「何かデータやプログラムを使うときに記憶しておく場所」である。単にRAMとしたとき、多くはDRAMを示す。はPCを構成するパーツの1つであり、主記憶装置である。DRAMとSRAMの2種類が存在するが、今回は一般にRAMと呼ぶDRAMについて扱う。以下、RAMは全てこのDRAMを示す。

これは簡単に言えば、作業スペースそのものである、と考えてもらって構わない。この作業スペースが広ければ、多くの作業の同時並行が可能になるのである。

RAMの動きを内部の専門的な用語などを使わずに概要を説明すると、以下のようになる。

  1. ユーザが何かのファイルを見ようとしたり、ソフトウェアを起動する。
  2. HDD/SSD(一般にストレージと呼ぶ)にあるデータにCPUがアクセスする。
  3. 読み込んだデータはRAMに置かれる。
  4. 必要に応じてCPUがRAMのデータを読み込んで、命令を実行する。
  5. 命令を実行後、その結果などがRAMに置かれる。
  6. 必要に応じて、RAMの内容がストレージに書き込まれる。
  7. 1.~6.を繰り返す。
  8. 言語の標準機能または手動でメモリ解放を行う。2)これをガベージコレクションと呼ぶ。Java, PHP等の高級言語には標準機能として搭載されている。C言語には標準機能に搭載されておらず、ライブラリを使用してプログラマが手動でソースコードを記述し、設定している。
  9. 電源を切るとRAMに置かれたデータは消滅する(揮発)。

大まかには、この流れである。基本的に、何かファイルやソフトウェアを起動したときにストレージからRAMにデータが置かれ、RAM―CPU間でデータのやり取りと処理を行っている。そして、命令に応じてRAMに置かれているデータがストレージに記録される。

なお、役目を終えたRAM上のデータは、使用するプログラミング言語が自動で破棄するか、プログラマが手動でソースコードを記述し、RAMの解放を行っている。また、最後に電源を切ると、RAM上の全てのデータが消滅するようになっている。これは「揮発する」と言われることがあり、RAMが揮発性メモリと呼ばれる理由でもある。

RAMの基本はこのようになっている。今回取り上げる仮想メモリに関しては、このあたりを押さえておけば問題ない。

本題:仮想メモリとは?

仮想メモリは、これも簡単に言うと、作業スペースの上にあるものを別のスペースに臨時で置いておく場所である。PCにおける別のスペースはHDD/SSDのストレージしかないため、仮想メモリはこのストレージ上に設定される。

仮想メモリはしばしば、「バーチャルメモリ」「ページファイル」という名称で呼ばれることがある。これらは同じものであり、Windowsユーザは、ページファイルで知っている人も多いだろう。

ストレージ上に設定されるため、1つの大きなシステムファイルとして扱われる。ただしデフォルトの設定では、隠しファイルの表示設定は非表示なので、通常は見えない。

動きとしては、何らかのデータやプログラムを起動する際、RAMのメモリ容量が不足する場合、使用していないデータやプログラムをPC側が判断し、仮想メモリに退避する。退避後はメモリ解放を行うことで、起動に必要な容量を確保する。これにより、動作が重くなること、及びフリーズ防止に一役買っている。

そして、退避したものは、使用時に仮想メモリから読み込まれ、再度RAMに置かれて、何事もなく動作する。ただし、復帰時にRAMへの書き出しを行うため、その分だけ時間がかかるようになっている。これはHDDの場合によくあることで、SSDであればすぐに復帰できる。

仮想メモリを多くしてもRAMが少ないと意味がない

仮想メモリは、RAM容量が足りなくなる場合に使用される、一時的な領域であることが分かってもらえたことだろう。これは、チップセットや仕様により搭載可能なRAM容量が少ないPC、増設や交換が不可能なラップトップを使用している場合、必須システムである。

だからと言って、RAMをケチってもいいというわけではない。そもそも仮想メモリを使用するのは、RAMが足りない場合である。

RAM上限が存在する場合は仕方ないが、現行のデスクトップはCPUがi3以上であれば、余裕で16GB以上にすることができる。普通の作業をするだけならともかく、ゲームやクリエイティブな作業をするには、最低限の容量として必要である。

特にゲームでは、RAM不足で頻繁に仮想メモリにアクセスすることになれば、カクカクになったり、途中でフリーズ、また仮想メモリとRAMとの間でのやり取りがうまくいかず、そのまま強制終了することも有り得る。その状況でゲームをするのはまず無理である。その前に、RAM不足をエラーの原因として、起動すら出来ない場合もある。

したがって、仮想メモリを設定する前に、RAMの増設やアップグレードが可能か調べる必要がある。それが無理なら、仮想メモリを設定するようにするといい。仮想メモリはRAMではないということを心に留めておく必要がある。



仮想メモリ論議:必要か不要か

ここまで、仮想メモリの基本的事項について解説した。仮想メモリは、64bitOSでもRAMの最大容量が少なかった頃に考えられたシステムである。Windows10となった今では、デスクトップではほぼ上限なし、ラップトップでも最低8GB以上が普通となり、仮想メモリを考えなくてもいい状況になっている。

そのとき、しばしば論議されるのが、RAMが十分だから不要説vsRAMがあっても必要説の仮想メモリの設定に関することである。様々な情報がネット上に存在するせいで、どれを信じるべきか分からないという事態が起きている。仮想メモリで検索しても答えが見つからず、ここまでたどり着いた人も、どれを信じたらいいのかと疑心暗鬼になっていることだろう。

ここでは、私は必要であると宣言し、その根拠を私が行った実験から説明していく。

2代目PC:HP EliteBook 8440pでの実験

実験1:仮想メモリ0MB(設定なし)で3日間稼動

HP EliteBook 8440pがまだ主力だったころ、仮想メモリなしでスリープを含めた3日間稼動を行った。当時は実験の意図はなかったので、画像記録がないが、8GBしかないRAMが、「変更済み」領域に占領される事態が発生した。この状態はリソースモニターで確認できる。

リソースモニターの見本。これはHP 8570wのもの。オレンジのバーが「変更済み」領域である。

しかもその領域が、全く減らないのである。通常、放置すればいずれ減るものだが、減らなかった。さらに、RAMを操作するツールである、Sync64.exeとRammap.exeから”Empty Modified Page List”を使用して強制書き込みを実行し、変更済み領域を解放するようにしたのだが、実行しても全く減らず、ずっと占有されたままであった。

この時点では原因は判明していなかったが、仮想メモリがないことによる書き込み不可能という仮説を立て、次の実験を行った。

実験2:仮想メモリ=RAMの最大容量に設定し同様の条件で実施

次に行ったのは、仮想メモリをRAMの最大容量に設定し、同様の条件でどうなるかを確認した。このとき、仮想メモリのサイズ変動を避けるため、初期サイズ=最大サイズにしてサイズを固定した。当時の設定では8192MB(8GB)に設定している。

その後、しばらく観察し、3日経った時点で、変更済み領域は殆どなかった。単に使っていないだけという可能性も考えて、empty.exeで強制的に変更済み領域を発生させ、それを再度書き込ませる実験を行った。

その結果だが、当時の画像が残っていたので、次のようになった。

empty.exeで強制的に変更済み領域を発生させた。この時点では書き込みと解放は行われていない。
次にsync64.exeとRAMMap.exeから”Empty Modified Page List”を実行する。すぐに変更済み領域が解放された。

この結果から、仮想メモリが設定されていると、変更済み領域が解放されたことから、仮想メモリに書き込まれてから、解放するシステムになっているものと考えられる。システムの意図する動作と異なっているような気がしないでもないが、仮想メモリを設定しておく必要があるのは間違いないと言える。そうしなければ、私の環境では変更済み領域を解放できなかったためである。

以上の結果から、仮想メモリは設定しておく必要がある。 (Q.E.D.)




仮想メモリを設定する

しかし、結果がわかっても、設定を正しく行わなければ意味がない。そのため、設定方法をここで掲載しておく。なお、Windowsでの設定であり、UNIXはここでは触れない。また、Windows7とWindows10で設定方法に差異はないので、どちらも同じ手順で設定できる。

  1. コントロール パネル/システムとセキュリティ/システム から「システムの詳細設定」を開く。
  2. 「システムのプロパティ」内、パフォーマンスの「設定」を開く。
  3. 「パフォーマンス オプション」内、仮想メモリの「変更」を開く。
  4. 「仮想メモリ」内の設定を以下の通りに変更する。
    • 「すべてのドライブのページング ファイルのサイズを自動的に管理する」のチェックをはずす。
    • 仮想メモリを置くドライブは原則システムドライブ以外にする。ドライブが1つしかない場合はシステムドライブで良い。
    • 「カスタム サイズ」を選択し、初期サイズ=最大サイズ=実装されているRAMの値とする。MB扱いのため、RAMの合計GB値を1024倍した値を入力。
    • 「設定」を押して反映させた後、OKを押して完了する。このとき再起動を求められる場合があるので、再起動前に保存するものを全て保存してから再起動する。
  5. 再度同じ手順で、仮想メモリが設定した通りの値になっているか確認する。

上記1.~4.を画像で説明すると、以下の通りとなる。

上記1.~4.を画像化したもの、画像が読めない場合でも上記の通りにやれば大丈夫。
[推奨:拡大]上記1.~4.を画像化したもの。この画面はWindows7だが、Windows10でも全く同じである。
補足として、初期サイズと最大サイズを同じにするのは、仮想メモリの断片化防止のためである。仮想メモリはストレージ上に作成される関係上、1つのシステムファイルとして扱われる。そのため、仮想メモリ自体が断片化すると、読み込み位置を移動する必要があるため、さらに動作が重くなる原因となる。したがって、はじめから仮想メモリのサイズを固定して、断片化が起こらないにようにする対処が必要である。

なお、この対処はストレージがHDDの場合に行うもので、SSDの場合この限りではない。ただし、仮想メモリのサイズは固定しておくに越したことはない。

たとえRAMが大容量でも設定は必須

仮想メモリは、RAMの最大容量が少なかった頃に考え出されたシステムである。その頃のPCは、まだRAMを多く使う作業が少なかったこともあり、少なくても良かった。だが、次第に要求されるRAMは多くなり、しかし足りなくなることから、仮想メモリで何とか凌いできた。

現在は、余裕で16GB以上を搭載可能となっている。下手をすれば、理論上無限にRAMを組めるだろう。流石にそこまでいかなくとも、十分なRAMのおかげで、仮想メモリに頼らなくてもいい状態になっている。

しかし、私としては、たとえ大容量でも設定は必須だと考えている。それは、過去に私が体験した、「変更済み」領域占有問題から、仮想メモリの役割は単純にRAMの退避場所だけとはいえない可能性があるからである。

だが同時に、これは私の憶測に過ぎず、またOSを解析できるようなスキルを持ち合わせているわけでもないので、真偽は不明である。おそらくは、公式に質問したところで、ブラックボックスとして回答は得られないだろう。

だが、もし仮想メモリの設定で悩んでいるなら、ここを1つの答えとして、実際に構成してみるといい。そして、解決してほしい。仮想メモリでこれ以上悩むことがなくなって、自分のやりたいことができるようになることを願っている。私が出来るのは、これくらいである。

 

以上、仮想メモリの設定の仕方であった。それでは、次回の記事で会おう。

 

リンクス岐部(LINKS-KIBE) at 21:40 Nov. 4th, 2019

 

追記:仮想メモリは特定のアプリケーションで必須になる場合がある

2020年11月4日追記

次はWikipediaからの引用である。

Windows XP以降ではページファイルを使用しないオプションが選択できる。もちろんこれは物理メモリの容量が十分に足りている場合(かつ、ページファイル必須アプリケーション運用を必要としない場合)にのみ選択すべきオプションである。ページファイルを使用しない場合、ほとんど使用されない常駐ソフトなどのデータをスワップアウトすることができなくなるので、キャッシュとして使える物理メモリの空き領域が減ってパフォーマンスが低下することがある。しかし、ファイルを読み書きするIOアクセスが起こらない為、パフォーマンスを落とさないというメリットがある。

仮想記憶#Windows NT系 – Wikipedia

Windows XP以降、設定から仮想メモリを無効にできるようになった。それに関連して書かれているのが、ページファイル必須アプリケーションが存在するということである。ただし、このアプリケーションが具体的に何を示すのか不明である。そもそもユーザ側が仮想メモリが必要かどうかを知る手段は非常に少ない。したがって、仮想メモリを一時的に無効にして、各アプリケーションを起動して動作に不具合が発生するかを確かめるしか、その方法はないだろう。

このことが判明したため、私の謎も少しだけ解明に近付いた。私の場合、変更済み領域の占領問題は、仮想メモリを必要とするアプリケーションを利用していた結果でそうなったものと考えられる。ただし、そのPCは既に廃棄になったため、真相は深層の中である(激寒)。

追記2:仮想メモリのゲーム向けの解説記事

2020年11月8日追記

仮想メモリのゲーム向けの情報を探している人は、下記の記事で答えが得られるであろう。

【ゲーム専用なら不要】ゲームと仮想メモリ実験~ゲームには必要ない!~

 

おまけ:使用したツール

リンク先はいずれもMicrosoftのダウンロードセンターである。


スポンサーリンク




脚注

Random Access Memory: 直訳すれば「無作為アクセス記憶媒体(装置)」、分かりやすく言い換えれば「何かデータやプログラムを使うときに記憶しておく場所」である。単にRAMとしたとき、多くはDRAMを示す。
これをガベージコレクションと呼ぶ。Java, PHP等の高級言語には標準機能として搭載されている。C言語には標準機能に搭載されておらず、ライブラリを使用してプログラマが手動でソースコードを記述し、設定している。
Links_Kibe
会社員という働き方が合わないのに会社員になってしまった、自称社会不適合者。自力で稼いでいくために奮闘中。PCとラーメンとXperia 1をこよなく愛する、自由になりたい人である。ゲームやガジェット、仕事中心に書いていく。

コメントを残す

メールアドレスが公開されることはありません。
名前は必須項目となります。記入をお願いいたします。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)