2010-11-18 3 views
3

Hallo, ich denke darüber nach, meine Fähigkeiten zu erweitern, indem ich einige Dinge ausprobiere, die ich noch nie zuvor gemacht habe. Eine Sache, die mich immer etwas verwirrt hat, sind Speicherzuordner und Speicherpools. Ich möchte einen Speicherblock nehmen und den Speicher nur einmal dem System zuweisen. Ich habe das derzeit eingerichtet, der Speicher ist ein Array von Bytes (oder Zeichen), die 65535 für meinen Testzweck ist.Richtiges Layout für einen Mempool/Speicherzuordner? (welcher Algorithmus)

Ich habe zwei Algorithmen, die ich in Betracht gezogen habe.

Zuerst ist ein Algorithmus, bei dem der gesamte Datenblock mit der Menge an verbleibendem Speicher und einem Zeiger (oder vielmehr einem Offset) an den ersten zugewiesenen Block (oder den Header des Blocks) und dann an jede Zuweisung angehängt wird wird die Größe der Zuordnung und die vorherige und nächste Zuweisung vorangestellt, damit ich die Zuordnung leicht freigeben kann. Ich kann dann die größten und kleinsten Blöcke erzeugen, indem ich das Leerzeichen nach den aktuellen Zuordnungen anschaue. Die andere Option, die ich habe, ist, einen zweiten Offset vor dem zugewiesenen Speicher hinzuzufügen und diesen Punkt auf den ersten nicht zugewiesenen Block zu setzen, dann hat jeder nicht zugeordnete Block auch die Zurück- und Nächste-Zuweisung, zusammen mit einer Größe, so dass ich es leicht kann finde einen Ort, wo meine nächste Zuteilung platziert werden kann.

Das Problem ist, ich kann nicht sagen, was "richtig" ist. Nehmen wir an, wir haben variable Größenzuweisungen (aber die meisten werden eine Größe haben, die nicht so viel Aufwand bedeutet.) Die erste wird langsamer sein, um die größten und kleinsten möglichen Blöcke zu bekommen, aber ich kann diese speichern und falls nötig manipulieren um zu vermeiden, sie zu regenerieren. Die zweite würde jedoch eine längere Zeit für die Freigabe benötigen (weil sie herausfinden muss, welcher Deallocator neben welchem ​​Allokator ist) und nicht notwendigerweise irgendwelche Vorteile für die Zuweisung bereitstellen. In der Tat wird es einen spezielleren Code für den Fall benötigen, dass weniger als 6 Bytes übrig sind (2 Bytes für die Größe, 2 für den vorherigen Offset, 2 für den nächsten Offset).

Mein Bauchgefühl sagt mir, der erste wäre weit überlegen, aber etwas über den zweiten ist verlockend. Irgendwelche Meinungen? Oder gibt es eine viel einfachere Lösung?

+0

Wenn die Geschwindigkeit über interfragmentation betrifft, ist ein Einheitszuweisungsschema in der Regel am schnellsten. Konstante Zeitallokation und frei. Keine Notwendigkeit, Speicherblöcke zu verbinden. Im Grunde eine Menge von Blöcken der gleichen Größe zuweisen, sie auf einem Stapel platzieren und sie als zugeteilt ablegen. Drücken Sie zurück, wenn Sie fertig sind. –

Antwort

Verwandte Themen