mallocを呼び出した後、brkポインタはどのように大きくなりますか?

mallocを呼び出した後、brkポインタはどのように大きくなりますか?

brk私はLinuxとCに初めて触れ、mallocを呼び出した後にポインタがどのように大きくなるかを尋ねたかったのです。私たちはカーネルがヒープの上部を指す brk ポインタを保持していることを知っています。要求されたメモリ割り当てを呼び出すときに利用可能な空きブロックがないとし、malloc内部malloc呼び出しについて知っています。mmap私の質問は次のとおりです。

Q1 -malloc内部で呼び出されると、開始アドレスが実際に最初の引数として渡されます。たとえば、次のようになります。mmapmallocbrkmmap

//not 100% correct onlyfor demo purpose
// void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

void *malloc(size_t size){
  ...
  mmap(brk, size,...);  
  ...                    //line x
}

Q2 - 内部の他のコードセクション(上記のx行目の後)は大きくなりますmallocbrk?それともmmap内部的に成長しておきますかbrk

ベストアンサー1

詳細は実装によって異なりますが、malloc少なくともDoug Leaの実装(GNU Cライブラリでデフォルトで使用される実装)では独立して使用されmmapますsbrk

  1. malloc実際にベースアドレスなしで呼び出されると、mmapカーネルに割り当てを委任します(整列制約を考慮して要求されたサイズを変更した後)。メモリは既存のヒープと連続するmmap必要はなく、mmap他の割り当てに再利用できます。

  2. mmap触れないでくださいbrkmalloc最終的に使用しない場合は、直接mmap呼び出してくださいsbrk進行状況mallocファイルの上部にあるコメントに詳しく説明されています。コードに従うには、関数を見つけてsysmallocそのコードのmmapisMMAPとisを覚えてくださいsbrkMORECORE

おすすめ記事