Linuxで仮想メモリを使い果たすことはできますか?
-
05-07-2019 - |
質問
仮想プログラムに似た私のアプリケーション:
for(;;) {
for (i=0; i<1000; i++) {
p[i] = malloc(random_number_between_1000_and_100000());
p[i][0]=0; // update
}
for (i=0; i<1000; i++) {
free(p[i]);
}
}
メモリリークはありませんが、私のシステムでは、メモリの消費量(上段、VSS列)は制限なしに増加します(使用可能な物理メモリの300%など)。これは正常ですか?
更新-しばらくの間メモリを使用してから解放します。これは違いですか?
解決
追加してみてください
sbrk(-1);
各ループの最後で、違いが生じるかどうかを確認します。
free()はメモリの割り当てを解除するだけですが、OSにそれを返しません。
他のヒント
動作は正常です。 man 3 malloc
を引用:
バグ
デフォルトでは、Linuxは楽観的なメモリ割り当て戦略に従います。これは、malloc()がNULL以外を返す場合、 メモリは実際に利用可能です。これは本当に悪いバグです。システムのメモリが不足していることが判明した場合、1つ以上のプロセスが 悪名高いOOMキラーによって殺されました。 Linuxが突然ランダムに失われることが望ましくない状況で採用される場合 プロセスを選択し、さらにカーネルバージョンが十分に新しい場合、次のようなコマンドを使用してこのオーバーコミット動作をオフにできます。
# echo 2 > /proc/sys/vm/overcommit_memory
カーネルのドキュメントディレクトリ、ファイルvm / overcommit-accountingおよびsysctl / vm.txtも参照してください。
実際に予約するには、Linuxカーネルのメモリにタッチ(読み取り/書き込み)する必要があります。
OSは通常、すべてのページを&quot; 0&quot;のコピーオンライトクローンとして割り当てます。 ページ、つまりゼロで埋められた固定ページです。ページから読む 期待どおり0を返します。あなたが読んでいる限り、すべての参照は行きます 同じ物理メモリ。値を書き込むと、「COW」は 壊れており、実際の物理的なページフレームが割り当てられています。この メモリに書き込まない限り、保持できることを意味します 仮想メモリのアドレス空間がなくなるまでメモリを割り当てる、または ページテーブルが使用可能なメモリをすべて使い果たします。
これらの割り当てられたチャンクに触れない限り、システムは実際にそれらを割り当てません。
ただし、OSがプロセスに課す制限であるアドレス可能なスペースが不足する可能性があり、必ずしもシステムポインタータイプでアドレス指定できる最大ではありません。