3

glibc の malloc 実装は 'malloc_trim()' 呼び出しをサポートしており、アプリケーション プログラムが未使用 (解放されたメモリ チャンク) を解放してシステムに戻すことができます (実装の詳細: 負の引数を指定して sbrk() を呼び出すと、プログラムのデータ セグメントが削減されます)。ただし、この機能はメインアリーナでのみ機能します。マルチスレッド プログラムでは、解放されたチャンクを保持するアリーナが複数あります。この呼び出しが他のアリーナからもメモリを解放しないのはなぜですか?

4

1 に答える 1

2

メイン アリーナ以外のアリーナは、おそらく使用しているシステムから割り当てられているため、そのメモリをシステムに返すmmapためsbrkに使用することはできません。mremapこれらの他の領域を縮小するために glibc を使用することは可能かもしれません。また、アリーナの最後にのみメモリを返すことができることに注意してくださいmalloc_trim。アリーナの中央に空のブロックがある場合、そのメモリを解放する方法はありません。

于 2012-06-25T20:23:16.343 に答える