malloc は Linux のプログラマーマニュアルでも実装の詳細が記述されています。
Normally, malloc() allocates memory from the heap, and adjusts the size of the heap as required, using sbrk(2). When allocating blocks of memory larger than MMAP_THRESHOLD bytes, the glibc malloc() implementation allocates the memory as a private anonymous mapping using mmap(2). MMAP_THRESHOLD is 128 kB by default, but is adjustable using mallopt(3).
英語嫌いの方のために説明をしておくと malloc() 関数は通常は sbrk() 関数なるものを使ってヒープのサイズを調整していますが、128kB を超えるメモリーブロックを割り当てようとすると mmap() 関数というものを使うってことです。
128kB の閾値を調整したい場合は MMAP_THRESHOLD 値を mallopt 関数によって調整できます。
MMAP_THRESHOLD には指定できる下限と上限があります。
The lower limit for this parameter is 0. The upper limit is DEFAULT_MMAP_THRESHOLD_MAX: 512*1024 on 32-bit systems or 4*1024*1024*sizeof(long) on 64-bit systems.
下限は 0 で上限は 64 ビットシステムであれば「 4*1024*1024*sizeof(long) 」となります。
mmap() には 1 回の割り当て上限はありますが、複数に分けた合計は超えることができます。
ただプロセスにも使用メモリーの上限があるので、それを超えることはできません。
プロセス全体での上限は ulimit でチェックができると思います。
$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 30475 max locked memory (kbytes, -l) 16384 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 30475 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
まあ実際にどこまで割り当てができるのか試したことはないのですがね…
(´・ω・`)
Copyright 2018-2019, by Masaki Komatsu