Heim >Backend-Entwicklung >C++ >Implementierung von Malloc () und Free () - Zusammenführung kleiner Blöcke
Dieser Beitrag baut auf dem vorherigen auf und adressiert die Speicherfragmentierung in einem benutzerdefinierten Speicher Allocator. Das Kernproblem besteht darin, dass die wiederholte Zuordnung und Befreiung kleiner Blöcke viele kleine, unbrauchbare Speicherlücken erzeugt und größere Zuordnungen auch dann verhindern, wenn ein ausreichender gesamter freier Speicherplatz besteht. Dieser Artikel beschreibt eine Lösung: Verschmelzung benachbarter kostenloser Blöcke.
Das Problem: Speicherfragmentierung
Der Autor veranschaulicht die Fragmentierung mit einem Codebeispiel und Diagrammen. Kleine Zuteilungen, gefolgt von Deals, hinterlassen fragmentierten freien Raum. Nachfolgende größere Zuordnungen scheitern, da kein einziger freier Block groß genug ist, obwohl der kombinierte freie Speicherplatz die Anforderung überschreitet. Die Diagramme zeigen dieses Problem visuell und zeigen, wie kleine, befreite Blöcke eine effiziente Wiederverwendung größerer freier Bereiche verhindern.
Die Lösung: Verschmelzte benachbarte freie Blöcke
Die Lösung besteht darin, benachbarte freie Blöcke zu verschmelzen, um größere, verwendbare Speicherbrocken zu erzeugen. Der Autor refaktoren den Code für eine verbesserte Lesbarkeit und Wiederverwendung und führt mehrere Helferfunktionen ein:
header_user_area(Header *header)
: Gibt einen Zeiger in den benutzergerechten Speicherbereich in einem Block zurück. header_address_after_block(Header *header)
: Gibt einen Zeiger unmittelbar nach dem Block an den Speicherort zurück. header_previous_available(Header *header)
: Überprüft, ob der vorherige Block kostenlos ist. header_next_available(Header *header)
: Überprüft, ob der nächste Block kostenlos ist. Eine neue Funktion, header_merge(Header *header)
, ist der Kern der Lösung. Es identifiziert angrenzende freie Blöcke und verschmilzt sie, wodurch die Größe und Zeiger entsprechend aktualisiert werden. Die Funktion behandelt Randfälle wie das Zusammenführen des letzten Blocks.
Integrieren Sie die Lösung in abfree()
Die Funktion abfree()
wird so geändert, dass er header_merge()
aufgerufen wird, bevor der Speicher befreit wird. Dies stellt sicher, dass benachbarte freie Blöcke kombiniert werden, bevor der Speicher an das System zurückgegeben wird.
Schlussfolgerung und nächste Schritte
Die verbesserte abfree()
-Funktion zusammen mit den Helferfunktionen reduziert die Gedächtnisfragmentierung signifikant. Der Autor stellt fest, dass eine letzte Herausforderung bleibt: Speicherblockausrichtung, die im nächsten Beitrag angesprochen wird. Die vollständige, aktualisierte abfree()
-Funktion und ihre unterstützenden Funktionen werden am Ende des Artikels bereitgestellt.
Das obige ist der detaillierte Inhalt vonImplementierung von Malloc () und Free () - Zusammenführung kleiner Blöcke. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!