第35章 top チャンク

目次

35.1. ビン

 トップチャンク( top chunk )はどのビンにも属さないメモリーチャンクです。

 名前の由来はアリーナのトップにある位置するからです。

 アクセスするためにマクロも容易されています。

arena.c(https://github.com/MacKomatsu/glibc/blob/release/2.27/master/malloc/arena.c). 

 38 /* HEAP_MIN_SIZE and HEAP_MAX_SIZE limit the size of mmap()ed heaps
 39    that are dynamically created for multi-threaded programs.  The
 40    maximum size must be a power of two, for fast determination of
 41    which heap belongs to a chunk.  It should be much larger than the
 42    mmap threshold, so that requests with a size just below that
 43    threshold can be fulfilled without creating too many heaps.  */
 44
 45 /***************************************************************************/
 46
 47 #define top(ar_ptr) ((ar_ptr)->top)

 このチャンクはまだ割り当ても解放もしていない未使用領域を示します。

 もしくは GDB でもアクセスする方法はあります。

(gdb) p main_arena.top
(gdb) p (&main_arena)->top
(gdb) p *((struct malloc_chunk*)((&main_arena)->top))

 最初の 2 行は top チャンクのアドレスですが 3 行目は malloc_chunk のオブジェクトの中身を表示できます。

 新たなメモリー割り当てのリクエスト(malloc)があったなら、ビン内にあるフリーチャンクから適当なサイズを探し出して割り当てしますが、適当なサイズのフリーチャンクがビンに見つからないときは、トップチャンクの領域を分割して割り当てします。

 もしトップチャンクがリクエストサイズより小さいなら sbrk() / mmap() によって領域を拡張します。

 メインアリーナが sbrk() でスレッドアリーナが mmap() を使います。

 では中身を図で確認しましょうかね。

img/top_chunk_data.png

 普通の malloc_chunk オブジェクトですよね。

 まあ新領域のボーダーのアドレスを覚えておくためのオブジェクトと考えれば良いかと思います。

Copyright 2018-2019, by Masaki Komatsu