読者です 読者をやめる 読者になる 読者になる

TenForward

技術ブログ。はてなダイアリーから移転しました

どこまで realloc 出来るか

Linux

じゃあ,malloc しまくるのを止めて,realloc で徐々に領域を広げて行った場合,どこまで行けるか.

同様のプログラムだけど,for 文の中は realloc をぐるぐる回す.

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main() {

    const int size = 1024*1024 ;
    int i ;
    char *p ;

    if ((p = (char*)malloc(size)) == NULL)
	exit(EXIT_FAILURE) ;

    for (i=0; ; i++) {
	if ((p = (char*)realloc(p, size*(i+1))) == NULL) {
	    perror("realloc") ;
	    break ;
	}
    }
    printf("Alloc size: %dMB\n", i) ;
    free(p);

    return(0) ;
}

実行すると,

$ ./alloctest2
realloc: Cannot allocate memory
Alloc size: 2047MB

これが 2GB 付近で止まるのは,

RLIMIT_AS
プロセスの仮想メモリ (アドレス空間) の最大サイズ (バイト単位)。 この制限は brk(2), mmap(2), mremap(2) の呼び出しに影響し、この制限を超えた場合はエラー ENOMEM で失敗する。また自動的なスタック拡張にも失敗する (さらに sigaltstack(2) を使った代替スタックを利用可能にしていなかった場合には、 SIGSEGV を生成してそのプロセスを kill する)。この値は long 型なので、32 ビットの long 型を持つマシンでは、この制限は最大で 2 GiB になるか、この資源が無制限になる。

http://ktarn.www.linux.or.jp/JM/html/LDP_man-pages/man2/getrlimit.2.html

かな? hira-consulting.com -  辺りを見ても.

違うような気も... 誰か教えてください.^^;

#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
  struct rlimit *resource;

  if(getrlimit(RLIMIT_AS,resource)==-1){
      exit(EXIT_FAILURE) ;
  }
  fprintf(stdout,"AS Max: %ld\n", resource->rlim_max);

  exit(0);
}
$ ./test 
AS Max: -1