brk
私はLinuxとCに初めて触れ、mallocを呼び出した後にポインタがどのように大きくなるかを尋ねたかったのです。私たちはカーネルがヒープの上部を指す brk ポインタを保持していることを知っています。要求されたメモリ割り当てを呼び出すときに利用可能な空きブロックがないとし、malloc
内部malloc
呼び出しについて知っています。mmap
私の質問は次のとおりです。
Q1 -malloc
内部で呼び出されると、開始アドレスが実際に最初の引数として渡されます。たとえば、次のようになります。mmap
malloc
brk
mmap
//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行目の後)は大きくなりますmalloc
かbrk
?それともmmap
内部的に成長しておきますかbrk
?
ベストアンサー1
詳細は実装によって異なりますが、malloc
少なくともDoug Leaの実装(GNU Cライブラリでデフォルトで使用される実装)では独立して使用されmmap
ますsbrk
。
malloc
実際にベースアドレスなしで呼び出されると、mmap
カーネルに割り当てを委任します(整列制約を考慮して要求されたサイズを変更した後)。メモリは既存のヒープと連続するmmap
必要はなく、mmap
他の割り当てに再利用できます。mmap
触れないでくださいbrk
。malloc
最終的に使用しない場合は、直接mmap
呼び出してくださいsbrk
。進行状況malloc
ファイルの上部にあるコメントに詳しく説明されています。コードに従うには、関数を見つけてsysmalloc
そのコードのmmap
isMMAP
とisを覚えてくださいsbrk
。MORECORE