2GB 以上だめなのって、32bit 符号付きな値でサイズ指定してるからそれ以上は一気にとれないだけじゃね?しかもさっきのプログラム、free() してないじゃん、ということに気づいたので、やってみた。
FreeBSD はまあ、loader.conf で設定してるから妥当。
% ./a.out malloc 128MB :OK! malloc 256MB :OK! malloc 384MB :OK! malloc 512MB :OK! malloc 640MB :OK! malloc 768MB :OK! malloc 896MB :OK! malloc 1024MB :OK! malloc 1152MB :OK! malloc 1280MB :OK! malloc 1408MB :OK! malloc 1536MB :OK! malloc 1664MB :OK! malloc 1792MB :OK! malloc 1920MB :OK! malloc 2048MB :failed...
MacOS X は 32bit 環境でもけっこういける。64bit 環境なら無限だ。
% ./a.out malloc 128MB :OK! malloc 256MB :OK! malloc 384MB :OK! malloc 512MB :OK! malloc 640MB :OK! malloc 768MB :OK! malloc 896MB :OK! malloc 1024MB :OK! malloc 1152MB :OK! malloc 1280MB :OK! malloc 1408MB :OK! malloc 1536MB :OK! malloc 1664MB :OK! malloc 1792MB :OK! malloc 1920MB :OK! malloc 2048MB :OK! malloc 2176MB :OK! malloc 2304MB :OK! malloc 2432MB :OK! malloc 2560MB :OK! malloc 2688MB :OK! malloc 2816MB :OK! malloc 2944MB :OK! malloc 3072MB :OK! malloc 3200MB :OK! a.out(2293) malloc: *** vm_allocate(size=134217728) failed (error code=3) a.out(2293) malloc: *** error: can't allocate region a.out(2293) malloc: *** set a breakpoint in szone_error to debug malloc 3328MB :failed...
テストプログラムはこんな感じ。
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #define UNIT 128 #define LIMIT 10240/UNIT // 10240/UNIT = max 10GB void hogealloc(int level){ void *p; int l; l = level + 1; printf("malloc %5dMB :", l*UNIT); if ( (p = malloc(UNIT*1024*1024)) == NULL ){ printf("failed...\n"); return; } else { printf("OK!\n"); if( l == LIMIT ) printf("exit.\n"); else hogealloc(l); return; } } main(){ int s=1; hogealloc(0); }
free() してないけど、まあ、これならいいだろ。