2017-05-27 64 views
7

İşte dlmalloc algoritmasının detaylı bir açıklamasıdır. İki bitişik boş parçalar biz kaç bayt boş alan bulunması raporunu bloke etmelidir Şimdi blok A'ya içine blok B birleşim istediğiniz durumdadlmalloc, kümeleri nasıl birleştirir? <a href="http://g.oswego.edu/dl/html/malloc.html" rel="noreferrer">http://g.oswego.edu/dl/html/malloc.html</a></p> <p>bir dlmalloc yığın yığın alan miktarı hakkında bilgi içerir bazı meta verileri tarafından bookended edilir:

[metadata | X bytes free space | metadata ][metadata | X bytes free space | metadata] 
       Block A          Block B 

gibi görünebilir? Ben meta 2X bytesrapor verecek diyen bir ders kitabı var çünkü bu, doğru olup olmadığını merak ediyorum

[metadata | X bytes free space metadata metadata X bytes free space | metadata] 

Ama: gibi şimdi coalesced blok görünüyor beri

Ben, bu 2X + 2 size(metadata) bytes olması gerektiğini düşünüyorum meta veriler üzerine yazabilmemiz için ekstra alan da dahil olmak üzere olmadan.

cevap

1

Yanıtı kendiniz görebilirsiniz looking at the source. Diyagramınızı doğrulamak için line 1876 ile başlayın. Meta veriler, bir struct malloc_chunk (line 1847 takma yoluyla erişilen yalnızca iki adet size_t işaretsiz tamsayıdır. Alan prev_size, önceki yığının boyutudur ve size, bunun boyutudur. Hem , struct malloc_chunk'un kendisinin boyutlarını içerir. Kodun 32 veya 64 bit adresleme için derlenmiş olmasına bağlı olarak bu, neredeyse tüm makinelerde 8 veya 16 bayt olacaktır.

"normal durum" kaynaştırma kod line 3766 başlar. Birleştirmeyi izlemek için kullandığı size değişkeninin yığın boyutunun olduğunu görebilirsiniz.

Yani - evet - o önceki hem sonraki parçalar boyutunu eklediğinde kod bloklar halinde şüphelendiğiniz gibi o örtük struct malloc_chunk boyutunu ekleyen, /* consolidate backward */ ve /* consolidate forward */ işaretlenmiş.

Bu, yorumunuzun doğru olduğunu gösterir. Beklentim, ders kitabı yazarı, yığın boyutu (metadata içeren) ve kullanıcıya ayrılan bellek bloğu arasındaki fark hakkında sadece özensizlik sağlamasıdır. Tesadüfen, malloc bu farkı line 3397 numaralı telefondan halleder. Bir şey öğrendin çalışırken - - kendiniz için ilk elden kaynak ve şekil şeyler düz dışarı çıkmak için bir fırsat atlamak asla

Belki burada büyük ders olmasıdır.