カーネルがマッピングに適した仮想アドレスを選択するために内部的にmalloc
呼び出され、最初の引数として渡されることがmmap
わかりNULL
ます。これは、マッピングが必ずヒープ領域(brkポインタで表される)には生成されないことを意味します。これが真であれば、複数の呼び出し後に仮想メモリの各ブロック間に多くの間隔があることを意味します。各呼び出しは、古いアドレスと連続しない新しい仮想アドレスを返すからです。mmap
malloc
malloc
malloc
私の質問:
各ブロックの間に隙間がある場合は、
brk
存在する理由がありますか?brk
下図のように、定義がヒープの上部を指しているからです。最初のブロックが
malloc
ヒープ(上の図の最初のブロック)からブロックを取得し、2番目のブロックがmalloc
開始アドレスが最初のブロックより低い2番目のブロックを取得し、brk
最初のブロックの終わりまたは終わりを指すと仮定します。第二ブロックの?以下は、問題を説明する図である。したがって、特定のブロックを解放すると、アロケータは通常、隣接する利用可能なブロックをマージして、これらの3つのブロックを1つの大きな利用可能なブロックに結合する必要があります。しかし、各ブロックは仮想メモリで連続していないため、これらのブロックをマージして解放することができないため、これらの動的メモリ割り当ては非常に非効率的ではありませんか?
答え1
malloc
使用中のmmap
プログラムの中断について心配しないでください。malloc
これは2つのメモリセットを使用します。つまり、独自に管理するヒープ(プログラム割り込み前領域)(GNU Cライブラリのアリーナを使用)とプログラム割り込みが最初のメモリセットを追跡するmmap
ed割り当てです。mmap
、2番目ではありません。 2番目のものが連続的である必要はありません。解放されたブロックはそのアロケータによってマージされます。
malloc
なしでメモリを割り当てた場合、mmap
これはmalloc
(またはs)の責任ですfree
。を使用してメモリを割り当てた場合、mmap
これは(または)mmap
の責任です。 edブロックmunmap
の場合、mmap
使用可能なブロックをマージすることは意味がないかもしれません。アドレス空間から削除されると、何もできません。 edブロックのマージが発生する可能性がありますが、mmap
2つのアドレス空間割り当てが連続的で同じ権限を持つ場合、割り当て時に発生します。