質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

5回答

12153閲覧

GB単位、ギガバイトクラスのメモリを確保する方法

Touhoku

総合スコア31

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2016/12/08 00:27

編集2016/12/08 01:57

分からないこと
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が有力なのかな?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ishi9

2016/12/08 01:07 編集

具体的には何GB確保できないのですか?1GBの時点でもう確保できないのですか?ちなみにx64用に作ったアプリでないと4GBの制限に引っかかります。
Touhoku

2016/12/08 01:24

タスクマネージャーで1GBの領域があるにも関わらず、確保できない場合があるので確実に確保する方法が知りたかったのです。32bit環境、64bit環境、場合分けでもよいですし、両環境共に対応できる方法や関数をご存知でしたらご返答お願い致します。
guest

回答5

0

ベストアンサー

物理メモリと仮想メモリの区別はできていますか?

物理メモリというのは、メモリ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億)が物理的な限界になります。
また、基本システムの設定によっても上限は変わります

投稿2016/12/08 04:55

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Touhoku

2016/12/25 21:49

物理メモリと仮想メモリの違いの詳しい説明ありがとうございました。どうやら私はそこの所をよく理解していない節があったので質問がちぐはぐになっている感じがございました。質問主意が上手く伝わらず反省しています。
guest

0

こんにちは。

malloc,freeは動的にメモリを確保できますがGBクラスのメモリサイズを確保できません。(処理系依存かもしれませんが出来ないことが多いと思います。)

具体的に確保できなかった例を書いた方が、的確な回答を貰えると思いますよ。
malloc自体に特に制限があると言う話は聞かないですから、普通は確保できることを期待しますので。

ところで、仮想メモリがあるので物理的な連続領域は不要ですが、仮想メモリ空間が分断されていたら、各塊のサイズを超える連続したメモリを確保することは不可能ですね。
昔からあるテクニックですが「最大サイズ確保→エラーが発生したらちょっとサイズを減らして取れなくなるまで確保→取れなくなったら更にサイズを減らして取れなくなるまで確保→以下同文」で限界まで確保できる可能性は高いと思います。

投稿2016/12/08 02:45

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Touhoku

2016/12/25 21:50

なるほど。この方法を既存のAPIで実現できれば可能な限りのメモリを確保できそうです。情報ありがとうございました。
Chironian

2016/12/26 03:03

たぶん、普通にmallocで取れると思います。 私はこれをやったことはないので何か意外な制限があるかも知れませんね。 もし、その制限をご存知なら教えてください。
guest

0

メモリを確保するには連続した空き領域が必要です。
なので、空いてる分全て使えるわけではないです。

VirtualQueryを使って最大の連続空き領域を調べるというのが一番現実的?
すいません、私も試した事無いのであまり確証はありません。

投稿2016/12/08 01:46

ishi9

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Touhoku

2016/12/08 01:49

なるほど。連続した空き領域が無いと確実に確保できるというわけではないと。盲点でした。確かにそのとおりですね。Windowsの場合、VirtualQueryで最大の連続空き領域を調べてその結果の値がそのマシンで現在利用できる最大のメモリ領域という事だと――。情報ありがとうございました。
ishi9

2016/12/08 01:55

すいません、そうですね。windowsの話ですね。 ちなみにmacだとvmmapを使うのがいいのかな? これも試したこと無いのでさっぱりですが
guest

0

例えば UNIX 系ですと、ハードレベルでの制限の他に、各プロセス単位に「利用可能なアドレス空間のサイズ」(ハードレベルの制限を超えることはできない)を設定できます。

そのような制限をかけられているとかないですかね。

Windows(32bit) の場合、1プロセス=1データセグメント=4GB の絶対的な限界があるうえに、上位1GBをシステムに予約されている(昔は2GB)ので、3GBが限界だったかと思います。
※ただしこれはAPIによるものなので、デバイスドライバレベルでなら話が変わります。現に32bit機で4GBを超えるメモリを積んだ場合に、Windowsから使えない部分をRAMディスクに転用するドライバがありますね

投稿2016/12/08 01:12

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Touhoku

2016/12/08 01:31

なるほど。UNIXの場合は各プロセス単位で制限がかけられている場合があるのですね。情報ありがとうございます。 32bitシステムの場合の情報もありがとうございました。 具体的な方法をご存じの方がいらっしゃいましたらぜひご返答お願い致します。
tacsheaven

2016/12/08 02:28

どのようなOSでも似通っていますが、メモリを確保するということは何らかの管理領域も合わせて使用しています。そして管理領域も(当然ながら)限界があります。 場合によっては「メモリは空いているけれども管理領域がない」(ものすごく細切れにメモリを確保した為に管理領域が枯渇した)ためにメモリ確保できない、という可能性もありますから、実装依存どころか実行環境依存しますね。
Touhoku

2016/12/25 21:51

なるほど。実行環境に依存する問題なのですね。情報ありがとうございました。
guest

0

フツーに確保できました。 Windows 10 x64, Visual C++ 2015 x64

C

1#include <stdlib.h> 2#include <stdio.h> 3 4int main() { 5 size_t size = 1024UL*1024UL*1024UL; 6 void* p = malloc(size); 7 if ( p != NULL ) printf("%zu allocated\n", size); 8 free(p); 9 return 0; 10}

X86だとキツいかもですねー

投稿2016/12/08 00:51

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Touhoku

2016/12/08 01:27

申し訳ないですが、malloc,freeですと各々のOSの環境(Windows2000,XP,Vista,7,8,10等)によって確保できるかどうかが不確実ですので、ソレ以外の確実な方法を知りたいのです。宜しくお願い致します。 例えば、 https://msdn.microsoft.com/ja-jp/library/cc429281.aspx に載っている関数で利用できるものがあるかどうか?等。(少なくとも私が見た限りでは見当たらない)
episteme

2016/12/08 01:38

> malloc,freeですと各々のOSの環境(Windows2000,XP,Vista,7,8,10等)によって確保できるかどうかが不確実 なぜに? ※ malloc/free を GlobalAlloc(GMEM_FIXED)/GlobalFree に置き換えてもフツーに確保できました。
Touhoku

2016/12/08 01:43 編集

Windows XP 32bit上の環境での実験です。これが私の環境依存ならばepistemeさんのWindows 64bit版上でのギガバイト単位のメモリ確保はmallocでも十分対応できるという考えでよろしいでしょうか?
episteme

2016/12/08 01:47

だと思いますよ。他のプロセスがメモリじゃぶじゃぶ使ってたら確保できないのは当然としても。
Touhoku

2016/12/25 21:52

ご返信ありがとうございました。新しい知見を得ることが出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問