VA Linux Systems Japan株式会社

ホーム 検索 お問い合わせ

English

 
 

 

ホーム VA Tech.Top テックライブラリーTop malloc(3)の管理構造-1

update : 2008/02/29

 

index

Xen特集

テックライブラリ

mallocライブラリのメモリ管理構造

 

1

mallocライブラリの動きの概要

2

メモリ管理部の構造

3

mallocライブラリで扱うメモリ単位

4

mallocライブラリのメモリ確保の流れ

5

freeライブラリのメモリ解放の流れ

6

mmapped chunkの確保、解放

7

main_arena以外のarenaのメモリ確保、解放の流れ

8

mallocライブラリとデバッグ

プレゼンライブラリ

イベントレポート

tips

VA Virtual-suite

仮想化に関するレポート販売

Xenを使ってみよう

Kernel対応障害解析サービス VA Quest

   
 
 


malloc(3)の管理構造

エンタープライズOS事業ユニット  角馬 文彦

malloc()

malloc()といえばC言語ではお馴染みのライブラリで、最も良く使用されるライブラリの一つです。しかしその分だけ何らかの不具合を経験した人も多いのではないでしょうか。本書ではmalloc()、free()で確保、解放されるメモリリソースが内部的にどのように管理されているかを説明していきます。mallocライブラリの仕様を理解する事で、ライブラリ使用時に何らかの不具合が発生した際の手助けになればと思います。

ここではLinuxディストリビューションで標準的に使用されているglibcのmallocライブラリを扱います。今回の調査では次の環境を使用しています。

ディストリビューション :Debian sarge
パッケージバージョン :glibc-2.3.2.ds1-22
OS : i386 Linux

本書では、上記の通りi386アーキテクチャの場合について記述しています。他のアーキテクチャ、64ビット環境では異なる場合もありますので、ご了承下さい。また、glibcのバージョンによっても多少異なる点があるかも知れませんが、こちらはそれほど大きな違いはないと思われます。

 

1. mallocライブラリの動きの概要

malloc()はプログラム内で必要なメモリを動的に確保したい場合に使う訳ですが、ではそのメモリはどの様に確保されているのでしょうか。
malloc()では通常、プロセスのアドレス空間のうちヒープという領域を利用しています。まずは特定のサイズのヒープ領域を空きプールとして確保します。これはsbrk()を使い現在のヒープ領域を拡張して行います。空きプールが足りなくなると随時sbrk()を発行してヒープ領域を拡張して補充します。そしてmalloc()はプロセスから要求されたサイズに応じてmalloc()の管理するchunkという単位で、確保したプールからメモリを切り出します。要求側にはchunkの管理部を除いた領域の先頭アドレスを返します。またmalloc()ではヒープ領域以外にも条件によりmmap()システムコールで確保した領域を利用します。どちらの領域を利用するかはプロセスから要求されたメモリサイズによって判断します。

malloc()によって確保されたメモリはfree()により解放しますが、実際にはその時点でヒープ領域が減少する訳ではありません。未使用となったchunkは未使用リストにリンクされ管理されます。そして次に要求のあった時に必要に応じて再利用されます(mmap()によって確保されたメモリについては、未使用リストにリンクされる事無くfree()の処理内でmunmap()により解放されます)。ただ永遠に解放しないと言う訳ではなく、一定の条件を満たした場合にはヒープ領域が減少されます。 これらはメモリ確保の処理を迅速に行う為の仕組みですが、これ以外にも処理を迅速にする工夫がされています。それらについてもおいおい述べていきます。

上述のメモリプールとは別にプール全体を管理する管理部があります。これらメモリプールとメモリプール管理部をひとつのまとまりとした管理単位をmalloc()ではアリーナ(arena)と呼びます。

 

次回以降にmallocライブラリのメモリ管理について解説していきます。

次へ


 
 
本サイトの利用に関して 免責事項 コピーライト 個人情報保護方針

Copyright C VA Linux Systems Japan. All rights reserved.