2017-05-27 67 views
7

Oto szczegółowy opis algorytmu dlmalloc: http://g.oswego.edu/dl/html/malloc.htmlJak dlmalloc łączy cząstki?

dlmalloc porcja jest bookended przez niektórych metadanych, który zawiera informacje o ilości miejsca we fragmencie. Dwa sąsiednie wolne kawałki może wyglądać

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

W tym przypadku chcemy łączyć blok B w bloku A. Teraz ile bajtów wolnego miejsca powinno blokować raport?

myślę, że powinno być 2X + 2 size(metadata) bytes, ponieważ teraz coalesced blok wygląda następująco:

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

Ale zastanawiam się, czy to prawda, bo mam podręcznika, który mówi metadane zgłosi 2X bytesbez numeru z dodatkową przestrzenią, którą otrzymujemy z możliwości zapisu przez metadane.

Odpowiedz

1

Możesz zobaczyć odpowiedź sam przez looking at the source. Rozpocznij od line 1876, aby zweryfikować swój diagram. Metadane to tylko dwie liczby całkowite bez znaku, dostępne przez aliasing struct malloc_chunk (line 1847). Pole prev_size jest rozmiarem poprzedniego fragmentu, a rozmiar size jest wielkości tego. Zarówno zawierają rozmiar samego siebie struct malloc_chunk. Będzie to 8 lub 16 bajtów na prawie wszystkich komputerach w zależności od tego, czy kod jest skompilowany dla 32- czy 64-bitowego adresowania.

Kod koalescencyjny "normalny przypadek" rozpoczyna się od line 3766. Możesz zauważyć, że zmienna size używana do śledzenia koalescencji to rozmiar chump.

Tak - Tak - w blokach kodu oznaczony /* consolidate backward */ i /* consolidate forward */, kiedy dodaje rozmiar poprzednich i następnych fragmentów, on niejawnie dodanie wielkości struct malloc_chunk jak podejrzewał.

To pokazuje, że Twoja interpretacja jest poprawna. Oczekuję, że autor podręcznika właśnie pomylił się na temat różnicy między wielkością porcji (która zawiera metadane) a rozmiarem bloku pamięci przydzielonego użytkownikowi. Nawiasem mówiąc, malloc zajmuje się tą różnicą pod numerem line 3397.

Być może większą lekcją jest to, że - kiedy próbujesz się czegoś nauczyć - nigdy nie należy pomijać okazji, aby przejść bezpośrednio do źródła z pierwszej ręki i wymyślić dla siebie.