Glibcメモリ管理

  

X86プラットフォームのLINUXプロセスのメモリレイアウトは以下のとおりです。

上記の意味は次のとおりです。

text:プログラムコードを保存し、決定するためのコンパイル時間、読み取り専用、

data:プログラムの実行時、読み書き可能時に決定できるデータを格納します。

bss:初期化なしで定義されたグローバル変数とスタティック変数;

ヒープ:通常解放されていない場合、プログラマー割り当てはプログラムの終了時にOSによってリサイクルされる可能性があります。

stack:コンパイラは自動的に解放を割り当て、関数パラメータ、ローカル変数などを格納します。

Mmap:マップ領域;

プログラムはシステムコールを使用してヒープとmmapを直接管理できますが、多くの場合、Cが提供するmallocとfreeを使用してメモリを動的に割り当て、解放します。 Linuxのスタック制限はだいたい8M、Windowsの場合は2Mです。

Cスタイルのメモリ管理プログラム:

もmallocで無料です。主にbrkまたはmmapで追加しています。仮想メモリ長期間記憶を維持する必要があるプログラムのためにmallocを使用してメモリを管理することは非常に期待外れになることがあります。

プールされたメモリの管理:

アプリケーションはより簡単にメモリを管理でき、メモリの割り当てと再生が速くなり、エラー処理プールを事前に割り当てることができるので、通常のメモリが使い果たされてもプログラムを使用できます。復元することができます;非常に使いやすい標準的な実装があります。

メモリプールはステージング可能な操作にのみ適しており、通常、サードパーティ製のライブラリではうまく機能しません;プログラムの構造が変更された場合は、メモリプールを変更する必要があります。割り当て

参照カウント:

参照カウント関数を呼び出すことを忘れないでください;ループするデータ構造の一部として解放することはできません;マルチスレッド環境ではもっと難しくて遅くなります。

ガベージコレクション:

メモリの二重解放やオブジェクトのライフサイクルについて心配することはありません;

はメモリが解放されたときに邪魔することができず、他のフォームより遅く管理することができます。使用されなくなったポインタをnullに設定するのを忘れた場合は、

Memory Managerの設計目標:

互換性を最大にする;

移植性を最大にするOSとの良好な通信)

は最小のスペースを浪費しました(独自のデータ構造の管理にもメモリが必要です。断片化に注意を払う必要もあります)。 2/8の原則、主にホットスポットの最適化に使用);

調整可能性を最大化(複数の配信ニーズに適応、または構成による適応);

局所性を最大化(ここで考慮しなければならないのは、CPUキャッシュとメモリの関係です);

デバッグ機能を最大限にする(プログラマである必要はありません);

適応性を最大限にする(変更なし)設定時の適応性);

ptmallocはmallocとfreeを実装していますそして、他の関数のセットは、動的メモリ管理のサポートを提供します。アロケータは、ユーザープログラムとカーネルの間に配置され、ユーザーの割り当て要求に応答し、オペレーティングシステムからメモリを要求し、それをユーザープログラムに返すために使用されます。効率的な割り当てを維持するために、アロケータは一般的に大量のメモリを事前に割り当て、それを何らかのアルゴリズムで管理します。ユーザーが解放したメモリがすぐにオペレーティングシステムに返されることはありません。設計時には、ptmallocは高効率、高スペース使用率、高可用性といった設計目標を妥協しました。設計の前提条件は次のとおりです。

mmapを使用して長いライフサイクルに大きなメモリを割り当てる;

非常に大きなメモリ割り当てでは常にmmapが使用されます。

短いライフサイクルのメモリ割り当てbrkを使用してください。

小さな一時メモリのみをキャッシュし、大きなメモリはシステムに直接返されるようにしてください。

小さなメモリブロックはmallocとfreeの場合にのみマージされます。 Br>

ヒープを縮小する条件は、現在の空き領域とその前後にマージできるチャンクのサイズの合計が64Kを超え、ヒープの上部のサイズがしきい値に達することです。

長期保存を必要とするプログラムは適切ではありませんPtmalloc;

全体的な構造は次のとおりです。

実際のデータはChunkです。使用中のChunkの構造は次のとおりです。

ここで、

P:前のChunkが使用中かどうかを示します;

M:フラグChunkはそのメモリ領域から取得した仮想メモリです;

A:フラグがプライマリアロケーション領域かどうか;

メモリ内のアイドル状態のチャンクの構造は次のとおりです。

glibcで空を管理するにはbinを使用します無料チャンク、詳細は記載されていません。空きチャンクがビンにリンクされている場合、ptmallocは前後のチャンクも空きかどうかをチェックします。空きチャンクがある場合は、次のように大きなchunk.bin構造にマージされます。

ptmalloc割り当てのスピードを上げます。最初にいくつかの小さな塊をFast binに入れます。ユーザが小さなメモリを割り当てると、ptmallocは最初に高速ビン内の応答の空きブロックを見つけ、次にUnsortedビンを探します。空きチャンクマージされたチャンク、または高速ビンに配置できないチャンクは、最初に未分類ビンに配置されます割り当て時に未分類ビンに要件が満たされていない場合は、未分類ビンのチャンクが追加されます。ビンに行きます。

メモリの割り当て時に下位から上位へのアドレスが割り当てられるため、このように大きな割り当てられたメモリ(サブヒープをシミュレートするために使用される)には空きメモリがある可能性があります。つまり、Top chunk.Topチャンクはfast binとbinの後にあると考えられるので、この区間はbins構造にはありません。 ptmallocがトップチャンク内のスペースの割り当てを管理し、トップチャンクが十分に大きくない場合、新しいサブヒープが再割り当てされ、トップチャンクが新しいサブヒープに移行されます。新しいサブヒープは、シングルリンクリストで既存のサブヒープに接続されています。次のように:

割り当てるスペースが十分に大きい場合、ptmallocはmmapを使ってメモリマッピングを使ってメモリをプロセススペースに直接マッピングします。このように割り当てられたチャンクは、それが空いているときにマップと直接接触し、そのようなメモリ領域を参照するとセグメンテーションエラーが発生します。

最後の残りのチャンクは別の特別なチャンクで、小さなチャンクを割り当てる場合、小さなビンに適切なチャンクが見つからない場合、最後の残りのチャンクのサイズが必要な小さなチャンクサイズより大きい場合。 。それから2つに分けられます。1つはユーザー用、もう1つは新しいLast残りのチャンク用です。

ptmallocがユーザーのメモリ割り当て要求に応答するための具体的な手順は、次のとおりです。

メイン割り当て領域のロックに失敗した場合は、非プライマリ割り当て領域を見つけて、新しい非プライマリ割り当て領域を作成します。

ユーザー要求のサイズを割り当てが必要なチャンクスペースのサイズに変換します。

chunk_size< = max_fastの場合は4に進み、それ以外の場合は5にジャンプします。

高速ビンに割り当ててみて、成功した場合は終了します。

chunk_size< = 512Bの場合1つのステップ、そうでなければ6をジャンプ;

対応するスモールビンが見つかった場合、割り当ては成功し、それ以外の場合は7に転送;

次の場合、高速ビン内のチャンクをマージします。チャンクは1つしかなく、このチャンクは最後の割り当てで使用され、割り当てられるチャンクサイズはスモールビンに属し、チャンクサイズは要件を満たしている場合、チャンクは直接切り捨てられ、割り当ては終了します。ごみ箱

at大きなビンで探す; 9にならなかった場合;

上のチャンクが要件を満たしている場合はそこからブロックを割り当て、それ以外の場合は10に戻ります。それがメインの割り当て領域である場合はトップチャンクを増やすためにsbrkを呼び出しますサイズ、それ以外の場合は新しいサブヒープを割り当てる、またはmmapを使用して直接割り当て、mmapを使用してターン11を割り当てる必要がある場合はターン12、
mmpシステムコールを使用してプログラムのメモリスペースを割り当てます。ユーザプログラムへのポインタを返します。

初めてmallocを呼び出すかどうかを決定し、それがメインアロケーション領域である場合は、初期化を実行します。それ以外の場合は、10の規則に従って割り当てられます。

Glibcメモリの急増を避けるためには、次の点に注意する必要があります。

割り当てられたメモリが最初に解放される(トップチャンクの考慮事項);

は次の目的には適していません。長期メモリを管理し、特に長期メモリを継続的かつ不定期に割り当てて解放する。

ptmallocのmmap割り当てしきい値の動的調整メカニズムを無効にしないでください。

マルチスレッドステージ実行プログラムはptmallocの使用には適していません(メモリプールの使用に適しています)。

プログラムのスレッド数を最小限に抑え、メモリの頻繁な割り当てと解放を避けます。

Copyright © Windowsの知識 All Rights Reserved