3 Stimmen

Richtiges Layout für einen Mempool/Speicherallokator? (welcher Algorithmus)

Hallo, ich denke darüber nach, meine Fähigkeiten zu erweitern, indem ich einige Dinge ausprobiere, die ich noch nie gemacht habe. Eine Sache, die mich immer ein wenig verwirrt hat, sind Speicherzuweisungen und Speicherpools. Was ich tun möchte, ist, einen Speicherblock zu nehmen und den Speicher nur einmal vom System zuzuweisen. Ich habe, dass derzeit eingerichtet, der Speicher ist ein Array von Bytes (oder Zeichen), die 65535 für meine Testzwecke ist.

Ich habe zwei Algorithmen, die ich in Erwägung gezogen habe.

Zunächst gibt es einen Algorithmus, bei dem der gesamte Datenblock mit der verbleibenden Speichermenge und einem Zeiger (bzw. einem Offset) auf den ersten zugewiesenen Block (oder den Header des Blocks) angehängt wird, dann wird jeder Zuweisung die Größe der Zuweisung sowie die vorherige und die nächste Zuweisung vorangestellt, so dass ich die Zuweisung leicht freigeben kann. Ich kann dann die größten und kleinsten Blöcke generieren, indem ich mir den Platz nach den aktuellen Zuweisungen ansehe.

Die andere Möglichkeit, die ich habe, ist, einen zweiten Offset vor dem zugewiesenen Speicher hinzuzufügen und diesen auf den ersten nicht zugewiesenen Block zu verweisen, dann hat jeder nicht zugewiesene Block auch die vorherige und nächste Zuweisung zusammen mit einer Größe, so dass ich leicht einen Ort finden kann, wo meine nächste Zuweisung platziert werden kann.

Das Problem ist, dass ich nicht sagen kann, was "richtig" ist. Nehmen wir an, dass wir Zuweisungen mit variabler Größe haben werden (aber die meisten werden so groß sein, dass dies nicht so viel Overhead bedeutet). Die erste Variante wird langsamer sein, um die größt- und kleinstmöglichen Blöcke zu erhalten, aber ich kann diese speichern und sie bei Bedarf manipulieren, um zu vermeiden, dass sie neu erzeugt werden. Die zweite Variante würde jedoch mehr Zeit für die Deallokation benötigen (weil man herausfinden muss, welcher Deallokator neben welchem Allokator liegt) und nicht unbedingt Vorteile für die Allokation bringen. Es würde sogar spezielleren Code für den Fall erfordern, dass weniger als 6 Bytes übrig bleiben (2 Bytes für Größe, 2 für prev offset, 2 für next offset).

Mein Gefühl sagt mir, dass die erste weitaus besser wäre, aber die zweite hat etwas Verlockendes an sich. Hat jemand eine Meinung? Oder gibt es eine viel einfachere Lösung?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X