システムのメモリ量をテストするACプログラムを作成しようとしています。さまざまな条件下で実行することを計画しています。
- スワップを有効にした場合
- スワップを無効にし、オーバーコミット(/ proc / sys / vm / overcommit_memory)をfalseに設定
- スワップを無効にし、オーバーコミット(/ proc / sys / vm / overcommit_memory)をtrueに設定
- システム上で実行されている仮想マシンの内部
これは、システムの実メモリと仮想メモリの制限でメモリ割り当てがどのように動作するかを知るために行っています。
私はこれを4GBのRAMと8GBのスワップを備えたマシンで実行しています。
私が現在持っているものは次のようなものです:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *ptr;
int mb = 1048576;
long long int i;
for (i = 0; i < 1000000000000; i++)
{
printf("Trying to allocate %lld MBytes\n", i * 10 * sizeof(int) );
ptr = (int*) calloc(10 * mb, sizeof(int));
if ( ptr == 0 ) {
// clean up
free(ptr);
printf("Ran out of memory\n");
return 1;
}
}
}
私はこれが40mbのブロックを割り当て続けることを望んでいました(私のシステムではsizeof(int)は4です)。Callocはメモリをゼロに初期化します。使用可能なメモリがなくなると、プログラムが終了し、メモリが解放されます。
私がそれを実行するとき、それは私の記憶の限界を超えて実行し続けます。「5707960メガバイトを割り当てようとしています」という行を印刷しているときに、最終的に停止しました。(約6000 GBのメモリを示します。)
誰かが私がどこで間違っているのか理解できますか?
この方法で割り当てる場合は、ページファイルサイズを考慮する必要があることを指摘してくれた@BlankXavierに感謝します。
次のようにコードを変更しました。
int main(void)
{
int *ptr;
int mb = 1048576;
int pg_sz = 4096;
long long int i;
for (i = 0; i < 1000000000000; i++)
{
printf("Trying to allocate %lld MBytes\n", i * pg_sz * sizeof(int) / mb );
ptr = (int*) calloc(pg_sz, sizeof(int));
if ( ptr == 0 ) {
// clean up
free(ptr);
printf("Ran out of memory\n");
return 1;
}
}
}
そして今、それは印刷を爆撃します:
「11800Mバイトを割り当てようとしています」
これは私が4GBのRAMと8GBのスワップで期待するものです。ちなみに、ディスクにスワップしているため、4GB以降は印刷速度が大幅に低下します。