Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> mallocのメカニズムuClibcを分析

mallocのメカニズムuClibcを分析

  

uClibcの組み込みLinuxシステムのlibライブラリC最も使用される内部。メモリ管理の完了はlibcのmalloc関数の研究では、コードの特別な部分を見つけるために、非常に混乱し、ユーザ空間になった後、最近の研究物事のLinuxカーネルのメモリ管理では、少し、少し経験があります。特別記事をまとめます。この文書構造::知識IIを準備:3の管理構造のヒープ領域:操作FA構造ファイブ:4のヒープ領域を初期化6のmallocの実装:7のフリーな実装:の概要:多くの場合、ユーザ空間:知識を準備それは、プロセスのヒープ領域にメモリを割り当て、mallocとfreeメモリ管理を呼び出します。; //構造体structヒープスペース空き領域heap_free_area * free_areasヒープ空間表現を示す構造体ヒープ{//データ構造:


II:ヒープ空間管理構造を以下に示すようにHEAP_USE_LOCKINGpthread_mutex_tロックの#ifdefマルチスレッド環境保護にロックするため; #endifの}; heap_free_area FAは、コード構造のコード構造と呼ばれます。以下のように定義される:構造体heap_free_area {空き領域size_tのサイズの//サイズ、次の循環リスト構造体のheap_free_areaを構築する//*、* PREV;};注意:構造中にFAおよび空き領域へのポインタを定義していません、 FAの構造は右側の空き領域の背後に配置されています。

3:ヒープ領域を初期化:グローバル変数は、スタック全体のスペースを表して__malloc_heap。示され、その初期化プロセスは、次の構造体ヒープ__malloc_heap = HEAP_INIT_WITH_FA(initial_fa);以下のようHEAP_INIT_WITH_FA定義:#ifdefのHEAP_USE_LOCKING#がHEAP_INIT {0、PTHREAD_MUTEX_INITIALIZER}#はHEAP_INIT_WITH_FA(FA){& fa._fa、PTHREAD_MUTEX_INITIALIZER}を定義する定義#他の位定義HEAP_INIT {0}#定義HEAP_INIT_WITH_FA(FA){& fa._fa}のように初期化initial_fa変数#endifの次のHEAP_DECLARE_STATIC_FREE_AREA(initial_fa、256);#定義HEAP_DECLARE_STATIC_FREE_AREA(名前、サイズ)\\静的構造体\\ {\\チャースペース[(サイズ) - はsizeof(構造体heap_free_area)]; \\構造体heap_free_area _fa; \\}名= {"" {(サイズ)、0、0}}このように、ヒープ初期化が256のバイトで見ることができます。上記初期から分かるように、フロントFA静的構造は、配列空間を画定します。これはまた、前記上&'を確認; 4; FA構造は、右スペアエリア&'の背後に配置:操作FA構造:1:の#define HEAP_FREE_AREA_SIZE(FA)((FA) - >サイズ)空き領域によって表さFA空き領域のFAが示される;(サイズ)> - - (FA)(ボイド*)((のchar *)(+ FA 1))の#define HEAP_FREE_AREA_START(FA):既に空間2を占めるFA自体が含まサイズ、開始位置。 FA + 1は、空き領域の最後に達します。 FA復帰によって表される遊離端領域の#define HEAP_FREE_AREA_END(FA)((ボイド*)(FA + 1))、その後、ポインタ部のサイズダウン、スペア領域3の開始位置です。 FAで表される構造からは見ることができます。 HEAP_MIN_FREE_AREA_SIZE \\ HEAP_ADJUST_SIZEの#define空き領域の(+ 32のsizeof(構造体heap_free_area))最小サイズ:FAからのずれの大きさは、単に自由4の端部に到達する、FAを扱います。スペア領域は、効率を考慮することである32バイトのスペアに加えて、最小サイズheap_free_areaを維持できるようにします。 mallocのメモリを割り当て、そして場合時にはそれは、一つのFAは、2つのセクションに分割されるであろう。残りのメモリがHEAP_MIN_FREE_AREA_SIZE未満の場合。私は同様に、すべてのメモリ割り当てを行くかもしれません。空きメモリが効率に影響を与え保護する必要があるため。これは後で5にmallocとfreeの我々の分析から見ることができます。__heap_delete(構造体のヒープ*ヒープ、構造体heap_free_area * FA)この関数は、ヒープから削除することでFAは、その実装は次のとおりです。externインラインvoid__heap_delete(構造体ヒープ*ヒープ、構造体heap_free_area * FA){IF(FA->次)FA->ネクスト> PREV = FA-> PREV; IF(FA-> PREV)FA-> prev->次= FA - >次、elseheap-> free_areas = FA->次; //それが第1のノードのリストを削除された場合}簡単な操作で、FAは円形のリストから切り離されます。 6:__heap_link_free_area(構造体ヒープ*ヒープ、構造体heap_free_area * FA、構造体heap_free_area * PREV、構造体heap_free_area *次の)機能の観点から、コード注釈は、PREVを参照し、次Faを間にマージ。実際にはそれだけで前と次のインサートのみの間です。;次=次; FA-> PREV = PREV; externインラインvoid__heap_link_free_area(構造体ヒープ*ヒープ、構造体heap_free_area * FA、構造体heap_free_area * PREV、構造体heap_free_area *次){FA->(PREV)prev-場合:以下を達成するために>次= FA; elseheap-> free_areas = FA; //(次)ネクスト・GT場合ケースの入口ノードとしてノードを挿入し、PREV = FA;} 7:__ heap_link_free_area_after(構造体ヒープ*ヒープ、構造体heap_free_area * FA、構造体heap_free_areaの* PREV)

Copyright © Windowsの知識 All Rights Reserved