mallocはヒープに連続した仮想メモリを割り当てませんか?

mallocはヒープに連続した仮想メモリを割り当てませんか?

カーネルがマッピングに適した仮想アドレスを選択するために内部的にmalloc呼び出され、最初の引数として渡されることがmmapわかりNULLます。これは、マッピングが必ずヒープ領域(brkポインタで表される)には生成されないことを意味します。これが真であれば、複数の呼び出し後に仮想メモリの各ブロック間に多くの間隔があることを意味します。各呼び出しは、古いアドレスと連続しない新しい仮想アドレスを返すからです。mmapmallocmallocmalloc

私の質問:

  1. 各ブロックの間に隙間がある場合は、brk存在する理由がありますか?brk下図のように、定義がヒープの上部を指しているからです。

    ここに画像の説明を入力してください。

    最初のブロックがmallocヒープ(上の図の最初のブロック)からブロックを取得し、2番目のブロックがmalloc開始アドレスが最初のブロックより低い2番目のブロックを取得し、brk最初のブロックの終わりまたは終わりを指すと仮定します。第二ブロックの?以下は、問題を説明する図である。

    ここに画像の説明を入力してください。

  2. したがって、特定のブロックを解放すると、アロケータは通常、隣接する利用可能なブロックをマージして、これらの3つのブロックを1つの大きな利用可能なブロックに結合する必要があります。しかし、各ブロックは仮想メモリで連続していないため、これらのブロックをマージして解放することができないため、これらの動的メモリ割り当ては非常に非効率的ではありませんか?

答え1

  1. malloc使用中のmmapプログラムの中断について心配しないでください。mallocこれは2つのメモリセットを使用します。つまり、独自に管理するヒープ(プログラム割り込み前領域)(GNU Cライブラリのアリーナを使用)とプログラム割り込みが最初のメモリセットを追跡するmmaped割り当てです。mmap、2番目ではありません。 2番目のものが連続的である必要はありません。

  2. 解放されたブロックはそのアロケータによってマージされます。mallocなしでメモリを割り当てた場合、mmapこれはmalloc(またはs)の責任ですfree。を使用してメモリを割り当てた場合、mmapこれは(または)mmapの責任です。 edブロックmunmapの場合、mmap使用可能なブロックをマージすることは意味がないかもしれません。アドレス空間から削除されると、何もできません。 edブロックのマージが発生する可能性がありますが、mmap2つのアドレス空間割り当てが連続的で同じ権限を持つ場合、割り当て時に発生します。

関連情報