質問: **分からないこと** malloc,freeは動的にメモリを確保できますがGBクラスのメモリサイズを確保できません。(処理系依存かもしれませんが出来ないことが多いと思います。) ここで各OSでのGB単位の大きなメモリ領域確保の方法が知りたくなりましたがどうにも検索にヒットしません。 せっかく、マシンに16GBや32GBもメモリを積んでいるのだから是非、自分のプログラムでメモリを使い切ってみたいです。 **知りたいこと** Windows,Linux,Mac各OS、及び32bit環境、64bit環境共にmalloc,free以外でのGBサイズのメモリを確保する方法。 複数の方法がある場合は複数返答頂けると嬉しいです。 具体的に場合分けします。物理的なメモリの空き容量には問題ないという前提です。 * Windows -- 32bit環境で限界までメモリを確保する方法 -- 64bit環境で16GBのメモリを確保する方法 * Linux -- 32bit環境で限界までメモリを確保する方法 -- 64bit環境で16GBのメモリを確保する方法 * Mac OS X -- 32bit環境で限界までメモリを確保する方法 -- 64bit環境で16GBのメモリを確保する方法 **途中経過** Linuxだとmmapを利用するのが有力かな? WidnowsだとVirtualQueryで帰ってきた値が最大の連続空き領域のようですよ。 Windows 64bit版だとmallocを利用するのが有力かな? Mac OS Xだとvmmapが有力なのかな?
回答: 物理メモリと仮想メモリの区別はできていますか? 物理メモリというのは、メモリICやメモリボード等の物(物理的存在)の事です。 パソコンやマザーボード等の説明書で「メモリ容量」と書かれているのは、物理メモリの容量の事です。 計算機では複数のプロセス(実行中のプログラム)が同時並行的に動作しますが、その中には待機中のものもあったりします。そうしたプロセスが使うプログラムやデータを全て物理メモリに収容しておこうとすると、大容量の物理メモリが必要になります。また、物理メモリの全てが使い尽くされるとプログラムで使っているデータに上書きされるなど異常が生じ、システムはクラッシュする事になります。 仮想メモリというのは、物理メモリより大きな仮想的なメモリ空間に、細切れにした物理メモリを割り当てる事で、あたかも大きなメモリが存在するかのように見せる方法です。 物理メモリに割り振れないデータはハードディスクなどの補助記憶装置に記録しておいて、そのデータが必要になったら読み出して物理メモリに戻す。物理メモリ上のデータが当面使われなくなる(それを使っているプロセスがアイドル状態になった等)とデータをハードディスクに記録しておいて、物理メモリを他のプロセスが使えるようにする。仮想メモリは、このような動作で実現されています。 物理メモリ、ハードディスクだけではなく、仮想メモリのメモリ空間と物理メモリの空間との対応付けをするハードウェア(MMU(Memory Management Unit))が使われます。(MMUはCPUチップに内蔵されています) 物理メモリは、ハードディスクに比べて2桁ほど値段が高いので、仮想メモリが使われるのが一般的です。(物理メモリ 16GB(DDR4 8GB x2枚)とハードディスク 3TBがどちらも1万円弱。でも、容量は200倍ほど違う) == == 質問にある「マシンに16GBや32GBもメモリを積んで」とか、コメントの「タスクマネージャーで1GBの領域がある」とかは、物理メモリに関するものです。 そして、Linux,Windows,MacOSなど、現在のほとんどの基本システムは仮想メモリを利用していて、malloc,freeなどのAPIは仮想メモリを操作するためのものです。 これらが区別されずに書かれているので、大丈夫かなぁという感じを受けました。 == ここから本題 == 物理メモリ: 物理メモリの管理(物理メモリをどう使うか)は基本システムがやっているので、ユーザが物理メモリの一部を確保するという事は、できません。基礎システムのパラメータを変える事で、物理メモリの使われ方に影響を与えられるだけです。 タスクマネージャで使われていない物理メモリの容量が大きかったとしても、それを直接使うことは出来ないのです。 仮想メモリ: 仮想メモリの最大容量は、物理メモリにあったデータを保存するハードディスク上のファイル(ページファイル)の容量と一致します。ページファイルを大きくすることで、仮想メモリ空間を大きくすると、大きなメモリ領域を確保しやすくなります。 例えば、物理メモリ16GBのマシンでページファイルを24GBにしてあって、1GBのメモリ領域の確保が困難だというのであれば、ページファイルを32GBにすることで解決するはずです。 物理メモリと仮想メモリの容量比が大きくなると、計算機のパフォーマンスが下がる(メモリとハードディスクの間の転送がしょっちゅう起こるようになるため)ので、極端にページファイルを大きくすることは勧められません。 (Windows7であれば、コントロールパネル->システムとセキュリティ->システム の中の 「システムの詳細設定」の「詳細設定」タブの中の「パフォーマンス」の設定の中の「詳細設定」タグの中に仮想メモリの設定をするところがあります) 既に、多くの方が指摘しているように32bitのCPUでは32ビットでメモリのアドレスを指定する必要がありますから、2の32乗(4G,約40億)が物理的な限界になります。 また、基本システムの設定によっても上限は変わります