|
malloc()はプログラム内で必要なメモリを動的に確保したい場合に使う訳ですが、ではそのメモリはどの様に確保されているのでしょうか。
malloc()では通常、プロセスのアドレス空間のうちヒープという領域を利用しています。まずは特定のサイズのヒープ領域を空きプールとして確保します。これはsbrk()を使い現在のヒープ領域を拡張して行います。空きプールが足りなくなると随時sbrk()を発行してヒープ領域を拡張して補充します。そしてmalloc()はプロセスから要求されたサイズに応じてmalloc()の管理するchunkという単位で、確保したプールからメモリを切り出します。要求側にはchunkの管理部を除いた領域の先頭アドレスを返します。またmalloc()ではヒープ領域以外にも条件によりmmap()システムコールで確保した領域を利用します。どちらの領域を利用するかはプロセスから要求されたメモリサイズによって判断します。
malloc()によって確保されたメモリはfree()により解放しますが、実際にはその時点でヒープ領域が減少する訳ではありません。未使用となったchunkは未使用リストにリンクされ管理されます。そして次に要求のあった時に必要に応じて再利用されます(mmap()によって確保されたメモリについては、未使用リストにリンクされる事無くfree()の処理内でmunmap()により解放されます)。ただ永遠に解放しないと言う訳ではなく、一定の条件を満たした場合にはヒープ領域が減少されます。
これらはメモリ確保の処理を迅速に行う為の仕組みですが、これ以外にも処理を迅速にする工夫がされています。それらについてもおいおい述べていきます。
上述のメモリプールとは別にプール全体を管理する管理部があります。これらメモリプールとメモリプール管理部をひとつのまとまりとした管理単位をmalloc()ではアリーナ(arena)と呼びます。
次回以降にmallocライブラリのメモリ管理について解説していきます。
|