第26章 MALLOC(3) Linux プログラマーマニュアル

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