LoginSignup
3
5

More than 5 years have passed since last update.

malloc()でLinuxの仮想メモリ空間のメモリ確保をし続けるだけのプログラム

Last updated at Posted at 2013-07-03

malloc()で単純にLinuxの仮想メモリ空間のメモリ確保をし続けるプログラムのサンプルです。
出力値は、繰り返し処理が行われるたびにmallocで確保するメモリと同値(1GB)を加算していくという簡易な計算処理の結果です。

実行環境

OS

CentOS 6.4 x86_64(64bit版)

% cat /etc/redhat-release
CentOS release 6.4 (Final)
カーネルバージョン
% uname -r
2.6.32-358.11.1.el6.x86_64
メモリ

物理メモリ2G、スワップサイズ2Gです。

% free
             total       used       free     shared    buffers     cached
Mem:       1922564      92680    1829884          0       7156      26016
-/+ buffers/cache:      59508    1863056
Swap:      2097144      11176    2085968
カーネルパラーメータ(※2013/7/4 追記)

コメントをいただきましたので追記します。
CentOS6のデフォルトでメモリオーバーコミットがされる設定となっています。
メモリオーバーコミットについての詳細説明は省略しますが、メモリが要求された際に、搭載されている物理メモリ以上のメモリ(仮想メモリ空間)を割り当てるというOSの機能です。

# sysctl -a | grep vm.over
vm.overcommit_memory = 0
vm.overcommit_ratio = 50

サンプルコード

get_vmem_test.c
#include <stdio.h>
#include <stdlib.h>

int main() {
  char *p;
  unsigned long i = 0;

  // 文字列変数に1GB(1073741824 B)のメモリを確保し続ける
  // メモリを確保できなくなるとmallocはnullを返すため、nullが返されるまで繰り返す
  do {
    p = (char *)malloc(1073741824);
    i=i+1073741824;
  } while (p != NULL);

  // iの値が確保できたメモリの総量となる(GB単位で出力)
  printf("%lu GB \n", i/1024/1024/1024);

  exit(0);
}

コンパイル

% gcc -o get_vmem_test get_vmem_test.c

実行

% ./get_vmem_test
122216 GB

補足(※2013/7/4追記)

参考にオーバーコミットを無効(vm.overcommit_memory=2)、割り当て可能なメモリを物理メモリ+スワップの合計値の99%(vm.overcommit_ratio=99)に指定した場合の実行結果を記載しておきます。この環境では最大4GB割り当て可能となります。

各パラメータの詳細については下記を参照してください。
* proc(5) - Linux manual page

カーネルパラメータ設定変更
# sysctl -w vm.overcommit_ratio=99 && sysctl -w vm.overcommit_memory=2
パラメータ確認
# sysctl -a | grep vm.over
vm.overcommit_ratio = 99
vm.overcommit_memory = 2
プログラム実行
% ./get_vmem_test
4 GB
3
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5