2

先週ずっと気になっていた質問があります。

Windows デバッガーには!heap -s、仮想メモリのヒープ ステータスを出力し、次の式を使用して外部フラグメンテーションを計算するコマンドがあります。

External fragmentation = 1 - (larget free block / total free size)

効果を計算するために必要な統計を出力する、Linux に同様の方法はありますか?

長い話: 私は、malloc と free を使用して、異なるサイズのスペースの割り当てと割り当て解除を続ける C アプリケーションを持っています。各割り当てには異なる寿命があります。私が使用しているプラ​​ットフォームは Lubuntu なので、ptmalloc2algorithm がデフォルトです。

これらの割り当ては仮想ユーザー空間ヒープで提供され (アロケーターが使用する 128Kb を超えるものを除くmmap)、実際にアクセスされたときに物理ページにマップされることを認識しています。割り当ての大部分は 80 バイト未満のサイズであるため、FastBins から提供されます。

を使用するValgrindMassif、各割り当てに使用される余分なバイトが報告されるため、内部の断片化を取得できます。

ただし、私の主な関心事は、外部の断片化をどのように把握するかです。/proc/[pid]/smapsヒープ サイズと統計は認識していますpmap-d[pid] anonが、それらを外部の断片化という観点から解釈するのは難しいと思います。

も認識しておりLD_PRELOAD、動的に接続できます/lib/i386-linux-gnu/libmemusage.so。このライブラリは、ヒープの合計、ピーク、および要求された割り当てサイズの分布を出力します。

私はそれが現在非推奨であることを知っており、や__malloc__hookのような実装固有の統計に本当に依存したくありません。ただし、これらの 2 つを使用する提案があれば教えてください。malloc_stats()mallinfo()

外部の断片化の問題は、ヒープに連続したスペースがないために要求を満たすことができない場合ですが、要求された合計サイズがその領域全体に散らばっていることがわかります。

この効果を計算できるように、必要な統計を取得する方法はまだわかりません。たとえば、 をキャプチャする、 をlive_memory取得するtotal_free_pages、または のサイズを取得する必要があることを示すさまざまな式largest_free_block。ヒープを「トラバース」してそれらの統計を収集する機能をどのように持つことができますか?

よろしくお願いします。

4

1 に答える 1

0

これは、使用しているアロケータに依存すると思います。つまり、使用しているmalloc (et al) とfree の実装に応じて、おそらく別の戦略が必要になるでしょう。実装が拡張機能として求める情報を提供しない場合は、そのソース コードを読み、独自のロジックを入力して、割り当ての状態を調べる必要があります。

スワップスペースと物理 RAM へのページのマッピングは低レベルにあるため、目標には特に役立たないと思います。malloc (その他) とfreeの実装は、これらの下位レベルの詳細を気にする場合と気にしない場合があります。

ptmalloc2を使用していることが確実な場合、そのソースコードを見つけることができますか?

于 2014-08-15T13:48:15.447 に答える