Linux で大量の仮想メモリを割り当てることは可能ですか?
おそらく。ただし、許可するように構成する必要がある場合があります:
<ブロック引用>Linux カーネルは、次のオーバーコミット処理モードをサポートしています
0 - ヒューリスティック オーバーコミット処理。アドレス空間の明らかなオーバーコミットは拒否されます。一般的なシステムに使用されます。オーバーコミットを許可してスワップの使用量を減らしながら、非常にワイルドな割り当てが失敗することを保証します。 root は、このモードでわずかに多くのメモリを割り当てることができます。これがデフォルトです。
1 - 常にオーバーコミットします。一部の科学アプリケーションに適しています。典型的な例は、スパース配列を使用し、ほぼ完全にゼロ ページで構成される仮想メモリに依存するコードです。
2 - オーバーコミットしないでください。システムの合計アドレス空間コミットは、物理 RAM のスワップ + 構成可能な量 (デフォルトは 50%) を超えることはできません。使用量にもよりますが、ほとんどの場合、ページへのアクセス中にプロセスが強制終了されることはありませんが、必要に応じてメモリ割り当てでエラーが発生します。
すべてのページを初期化することなく、メモリ割り当てが将来的に利用可能であることを保証したいアプリケーションに役立ちます。
オーバーコミット ポリシーは、sysctl `vm.overcommit_memory' を介して設定されます。
したがって、物理メモリよりも多くの仮想メモリを割り当てたい場合は、次のようにします。
# in shell
sysctl -w vm.overcommit_memory=1
<ブロック引用> RLIMIT_AS プロセスの仮想メモリ (アドレス空間) の最大サイズ (バイト単位)。この制限は、brk(2)、mmap(2)、mremap(2) の呼び出しに影響し、この制限を超えるとエラー ENOMEM で失敗します。また、自動スタック拡張は失敗します (そして、sigaltstack(2) によって代替スタックが利用可能にされていない場合、プロセスを強制終了する SIGSEGV を生成します)。値が long であるため、32 ビット long のマシンでは、この制限が最大 2 GiB であるか、このリソースが無制限です。
したがって、次のものが必要です:
setrlimit(RLIMIT_AS, {
.rlim_cur = RLIM_INFINITY,
.rlim_max = RLIM_INFINITY,
});
または、プロセスにこれを行う許可を与えることができない場合は、これを /etc/security/limits.conf で永続的に構成できます。これは、(ユーザー/グループの) すべてのプロセスに影響します。
<ブロック引用>わかりましたので、mmap は ... をサポートしているようですが、ファイル記述子が必要です。 ... 勝てる可能性がありますが、ファイルに裏打ちされている必要がある場合はそうではありません ... ファイルに添付するという考えは好きではありません
ファイルに基づく mmap を使用する必要はありません。そのための MAP_ANONYMOUS があります。
<ブロック引用>リクエストするために入力する番号がわかりません
次に、null を使用します。例:
mmap(nullptr, 256*GB, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
とはいえ、説明どおりにシステムを構成した場合は、 new
mmap
と同じように動作するはずです .おそらく malloc
を使用します おそらく mmap
を使用します このような大規模な割り当ての場合。
おまけのヒント:HugeTLB ページを利用することでメリットが得られる場合があります。
256*GB
の値 32 ビット整数型の範囲に収まりません。 uint64_t
を試す GB
の型として :
constexpr uint64_t GB = 1024*1024*1024;
または、代わりに 64 ビットの乗算を強制します:
char* p = new char[256ULL * GB];
OT:この GB
の定義の方がいいと思います :
constexpr uint64_t GB = 1ULL << 30;
仮想メモリの制限については、この回答を参照してください。