Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> LinuxシステムFAQ >> glibc(ptmalloc)解決方法

glibc(ptmalloc)解決方法

  

直接上に戻るコード:

#include< stdio.h>

#include< stdlib.h>

#include< string.h>

int main()

{

int alloc_time = 4000;

char * a [alloc_time];

char * b [alloc_time];

int i、j;

for(i = 0; i< alloc_time; i ++)

{

a [i] =(char *)malloc(52722);

memset(a [i]、1、52722);

b [i] =(char *)malloc(1);

memset(b [i]、1、1);

}

printf( " malloc finished \\ n");

for(i = alloc_time-1; i> = 0。 i--)

{

free(a [i]);

free(b [i]);

}

printf(「自由終了\\ n」);

//char * p =(char *)malloc(2000);

//free(p);

while(1){

sleep(3);

}

}

このテスト手順を実行してください。この手順では、Glibcサーバーへの内在的な返信が行われていますが、内在的な管理を実現するためには、Glibcサーバーはチャンク構造を使用していません。 ptmallocは、ヒープとmmapのマッピング領域内の空きチャンクを管理するためにも使用されています。空のチャンクについては、ptmallocは、空のチャンクの大きさおよび処理されている状態に応じて縮小される。

bins:ptmallocは同じような大きさのチャンクを両方向のチェーンとするために使われています。長さ(小ビン)は、8文字ごとに1つのブロックに割り当てられ、後の64個は、長さが一定でない(1つの範囲に)割り当てられます。長さが512文字以下のものは、長いものに割り当てられ、その後の64個のものは、長さが最大のものから順に並べられています。これは1つのキャッシュで、すべて無料の場合、ビンの中に入れる必要があります。ソートされていないビンに入れるには、適切なチャンクがあるかどうかを調べます。それ以外の場合は、ソートされていないビンのすべてのチャンクをビンに入れます。これは、最大10個の固定長のキューで、すべて無料で、長さはmax_fast以下です。このチャンクへのチャンクは、空き時間に使用され、使用されているブロックは修正されることなく修正されない。これは、隣接するブロックの統合を回避するためのものである。それは、その中の1つのグループの中にあり、空のチャンクの3番目の文字と4番目の文字を使用することで、先頭と末尾のチェーンを変更します。

mallocの手順:

1. fastbinsに入る前に、次の一覧を読んでください(再配置の必要はありません) 1)立てて返信する。

2.要求されたブロックがスモールビン(ビンの前の64個のビン)の範囲内にあるかどうかを判断し、要求されたブロックが満たされていれば、そのまま返却する。;

3.これを実行するには、配分の必要性が1ブロック内に収まっているか、または適切なチャンクが存在するかどうかを確認してください。隣接するチャンクを結合して、ソートされていないビンに結合します(大きな箱の中にあるので) 4.分割されていないビンに1つのチャンクを取り出すには、同じサイズのチャンクが必要であれば、それを元に戻します。必要なチャンク大のチャンクは、それらをビンに挿入するための対応する列の中で、2に変換されています。ソートされていないビンには適切なチャンクがありません。また、fastbinに入っているビンとソートされていないビンにあるすべてのチャンクは、完全に整理されています。さらに小さなチャンクを構築し、チャンクを2つの部分に分け、残りのチャンクをunsortに取り込んで、そのチャンクの内部アドレスを元に戻します。
fastbinsとbinsのすべてを検索適切なチャンクは、トップチャンクを操作することを要求されています(トップチャンクの1つのチャンクであり、誰にも当てはまるものではありません)。上トップチャンクも割り当て要件を満たすことができず、sysallocを調整するだけで十分であり、そのためには最後に内部アドレスを返します。

free手順:
必要なチャンクがmmapedチャンクであるかどうかを判断し、munmapをmmapedチャンクに変更し、内部の空のマップを無効にします。このスペースが無効になることはありません。
2.トップチャンクと隣接している場合、トップチャンクと直接結合されている場合は、他の空白文字列を削除する必要はありません。この場合、最大最小max_fast(80字)が返されます。つまり、ファストビンにフックされている場合は返されますが、1のままで使用されます。これは、さらにブロックを削除してリターンすることを意味します。チャンクの使用位置を0にして、前のチャンクが使用中であるかどうかを判断し、前のチャンクが空のブロックでもある場合には、それを結合して下されるかどうかを判断する。トップチャンクとして、下のチャンクがまだ使用されていないかどうかを判断し、もし空になっていれば、結合されたチャンクをアンソートされたキューに入れる。トップチャンクに隣接するチャンクのうちの1つが解放されることを説明するために、トップチャンクと結合される。

8.結合後の最小サイズがFASTBIN_CONSOLIDATION_THRESHOLD(64K)を超えている場合は、統合、つまりfastbinsの結合操作、結合後のチャンクは未分類のbinに配置され、fastbinsは空になり、操作が完了します。 (topchunkの大きさはmmap以上であるかどうかを判断して、128KBに相当します)。

ptmalloc 128K(mmap割当閾値)よりも小さいブロックは、ヒープ内で分割または圧縮される。従来のブロックでは、適切なチャンクを見つけることができない場合がある。 ptmalocの内在的な回収は、トップチャンクからのものであるからである。隣接するチャンクは内部のセルには表示されず、上位のチャンク以下の空の内部チャンクはシステムに返されません。つまり、これらのチャンクは数百個のGが含まれていなくてもかまいません。

テストプログラムが分配された後、ブロックをファストビンに入れるときには、ブロックとブロックとが交互に存在するように変更されたままにされる。隣接するブロック、およびその隣接するブロックの使用位置も1であり、隣接するブロックのサイズを64Kより小さくすることはできません。すべてのブロックが完全に解放された後は、すべてのブロックはfastbinsの領域で使用されます。また、使用される部分はすべて、未ソートの領域に固定されています。循環後に2000文字を再分割した後にリリースされた場合、すべてのものは完全に空白になっています。これは、mallocのために統合されていました。すべてのファストビンがクリーンになるときと同様に、隣接するブロックも一緒になってトップチャンクになるときには、それらも一緒になってトップチャンクになる。 64Kよりはるかに小さいため、すべてのグループが圧縮され、システムにも保存されます。

Copyright © Windowsの知識 All Rights Reserved