付録A 付録
A.1. mallopt
mallopt
は、プログラムによる malloc メモリアロケータの動作の変更を可能にするライブラリーコールです。
例A.1 アロケータヒューリスティック
アロケータには、昔からあるオブジェクトと最近できたオブジェクトを見分けるヒューリスティックがあります。前者に対しては
mmap
を割り当てようとし、後者には sbrk
を割り当てようとします。
これらのヒューリスティックを上書きするには、
M_MMAP_THRESHOLD
を設定します。
マルチスレッドのアプリケーションでは、アロケータは arenas にある既存のロック競合に対応して複数の arenas を作成します。これより、いくつかのマルチスレッドのアプリケーションでは、メモリ使用量が増えるという代わりに、パフォーマンスが大幅に改善する場合があります。これをコントロールしておくには、
mallopt
インターフェースを使って作成可能な arenas 数を制限します。
アロケータには、作成できる arenas の数に限りがあります。32 ビットのターゲットの場合、2 * # のコア arenas を作成します。64 ビットターゲットの場合、8 * # コア arenas を作成します。
mallopt
を使うと、開発者はこれらの制限を無効に出来ます。
例A.2 mallopt
9 以上の arenas が作成されないようにするには、以下のライブラリーコールを発行します。
mallopt (M_ARENA_MAX, 8);
mallopt
の最初の引数は、以下のものが可能です。
- M_MXFAST
- M_TRIM_THRESHOLD
- M_TOP_PAD
- M_MMAP_THRESHOLD
- M_MMAP_MAX
- M_CHECK_ACTION
- M_PERTURB
- M_ARENA_TEST
- M_ARENA_MAX
上記の引数の特定の定義は、http://www.makelinux.net/man/3/M/mallopt で確認できます。
malloc_trim
malloc_trim
は、アロケータに未使用のメモリをオペレーティングシステムに戻すように要求するライブラリーコールです。これは、オブジェクトが解放済みの場合、通常は自動で行われます。しかし、小さいオブジェクトを解放している場合、 glibc
がメモリを即座にオペレーティングシステムに戻さないこともあります。この理由は、メモリをオペレーティングシステムからリリースさせて割り当てるのは高くつき、空きメモリは来たるべきメモリ割り当て要求を満たすために使用できるからです。
malloc_stats
malloc_stats
は、アロケータの内部状態を stderr
にダンプするために使用されます。mallinfo
はこれに似ていますが、代わりに状態を構造体に置きます。
追加情報
mallopt
に関する追加情報は http://www.makelinux.net/man/3/M/mallopt および http://www.gnu.org/software/libc/manual/html_node/Malloc-Tunable-Parameters.html にあります。