malloc関数の基本となる実装

 

 この絵を見ては、32ビットのシステムアドレス空間4gと、Linuxの0-3Gは、ユーザーモード、カーネルモード3-4Gです。

ユーザーモード(上から下へ。なお、メモリアドレス、下位アドレス0xc0000000-0x08048000に高いアドレス)にはいくつかのセクションがあります。

(1)コード・セグメント:プログラムバイナリイメージを格納

(2)データ・セグメント:グローバル変数および初期化ローカル静的変数を格納します

(3)BSS基:ストレージ初期化されていないグローバル変数とローカル静的変数

(4)ヒープ:ヒープスペース、音符マークBRKノード位置()は、下側から上位アドレスの拡張に、あります

(5)メモリマッピング:メモリマッピングセグメント

(6)スタック:スタック領域、アドレスを下げるために、より高いから延長

 

Linuxはそのヒープのアドレス空間へのポイントブレークポインタを維持しています。ブレークの間のアドレス空間マッピングにヒープアドレスから始めて良いですが、プロセスがアクセスするために使用することができ、かつ、ブレークアップからすると、マップされていないアドレス空間で、プログラムエラーであれば、この空間へのアクセス。私たちは、malloc関数を使用して実行され、ブレークアップからメモリを割り当てます。

プロセス、実際に使用することができ、唯一の物理メモリにマッピングされたページで、物理的なストレージ容量の制限のために仮想メモリアドレス空間に直面し、全体のヒープの仮想メモリ空​​間は、すべて実際の物理メモリにマッピングすることはできません。

 

、初期ポインタメモリアプリケーションでブレークへのポインタを取得します。

ポインタのシステムコールsbrkの(変位量)BRK位置を移動させることができ、戻りポインタBRKの位置は、アプリケーションメモリの目的を達成します。

システムコールBRK(void *型のaddr)、成功すると0を返し、失敗した1復帰のための直接アドレスBRKを設定することができます。RLIMITリミットポインタプロセスヒープメモリ容量

ビューのオペレーティングシステムの観点から、メモリを割り当てる2つの方法があり、ポインタは、BRKを促進するアプリケーションのメモリ空間へのスタックの有効面積を増加させることである、そして他の使用MMAP、プロセスの仮想アドレス空間内の中間体(ヒープ及びスタック無料の仮想メモリを見つけるために)ファイルマッピングエリアと呼ばれる場所。多分種類の仮想メモリーのが割り振られ、あなたが最初の仮想アドレス空間を訪問したときにのみ、オペレーティングシステムは、物理メモリを割り当てることになります。

 

BRKのmalloc関数は、メモリの動的割り当てを使用することです。

malloc関数の本質は、すなわち、使用可能なメモリブロックがリストに接続されているフリーリストです。必要とされるユーザの要求を満たすためにメモリの大きなブロックを探し、malloc関数を呼び出すとき、メモリブロックは、ユーザ(アプリケーションのサイズ)、他の部分(もしあれば)に分配するため、二つに部分に分割されます

フリーリストに戻る、見つかった場合は、アプリケーションのメモリ空間を促進するためのsbrk()BRKポインタを呼び出します。

無料ブロックの検索アルゴリズムは、以下のとおりです。

(1)最初の適応:最初に十分な大きさを見つけるには、それが割り当てられています。これは、メモリの断片化の多くを持っています

(2)フィッティング:見つけるために二度目、分布、より少ない生成。

(3)ベストフィット:すべてのブロックを介して網羅的探索、最小差分ブロック割り当てを見つけます。

フリーリストにユーザーを解放にメモリブロックを接続するには、フリーコール、破片偽を形成し、メモリブロックがに、またはメモリの2つのブロックの同等隣接している場合でも、マージされませんが、メモリの解放した後、あなたは、メモリの統合を実行する必要があり、大きな空きブロックに隣接する小さな空きブロック。

 

メモリブロックの一般的な構造:周辺+メタデータ領域、記録データブロック(データブロックサイズ、アイドルフラグ、ポインタ)にメタメタ情報領域は、データ領域は、実際の分布のメモリ領域であり、第一のデータエリアバイトアドレスは、malloc関数のアドレスで返されます。

 

暗黙のリストと二重リンクリスト:

一暗黙的にリンクされたリスト、配列事実は、空間のmalloc関数割り当ては、それが境界を区別することを可能にするデータ構造を持っている必要があり、スペースと割り当てられた領域、ヘッダ情報とペイロードを含むデータ構造の区別、ペイロード最初のアドレスは、メモリ位置合わせを維持するために、可能性の尾部を埋める、malloc関数によって返されたアドレスです。次のブロックアドレスのメモリアドレスと暗黙的にリストをリンクされているブロックサイズ、の先頭アドレスを起動することができ、自由空間、ブロックサイズ情報が含まれているメタデータのデータ構造にしているか否かに対応するヘッド。
----------------
それが表示されているフリーリストを使用することで達成する方法は、これは本当にリンクリストで、そこにあります。それはまた、二重リンクリストと呼ばれ、前の前駆体のペイロード・ポインタの洪水の前と後に追加されました。最初LIFO(LIFO)であるフリー・リストを維持するようにして、新たに解放されたブロックは、リストの先頭に配置されています。もう一つの方法は、アドレスの順序を維持することです。

 

不十分なメモリ機能は、記憶領域の割当てに失敗しました場合は、戻り値がNULLであるかどうかをテストする、NULLポインタを返します。

 

おすすめ

転載: www.cnblogs.com/EvansPudding/p/12602580.html