目次
トップチャンク( 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() を使います。
では中身を図で確認しましょうかね。
普通の malloc_chunk オブジェクトですよね。
まあ新領域のボーダーのアドレスを覚えておくためのオブジェクトと考えれば良いかと思います。
Copyright 2018-2019, by Masaki Komatsu