Was bedeutet der Begriff Arena in Bezug auf das Gedächtnis?


100

Ich lese ein Buch über das Gedächtnis als Programmierkonzept. In einem der späteren Kapitel verwendet der Autor das Wort Arena stark , definiert es jedoch nie. Ich habe nach der Bedeutung des Wortes und seiner Beziehung zum Gedächtnis gesucht und nichts gefunden. Hier sind einige Zusammenhänge, in denen der Autor den Begriff verwendet:

"Das nächste Beispiel für die Serialisierung beinhaltet eine Strategie, die als Speicherzuweisung aus einer bestimmten Arena bezeichnet wird ."

"... dies ist nützlich, wenn Speicherlecks behandelt oder aus einer bestimmten Arena zugewiesen werden ."

"... wenn wir die Erinnerung freigeben wollen, werden wir die gesamte Arena freigeben ."

Der Autor verwendet den Begriff über 100 Mal in einem Kapitel. Die einzige Definition im Glossar lautet:

Zuweisung aus der Arena - Technik, bei der zuerst eine Arena zugewiesen und dann die Zuweisung / Freigabe innerhalb der Arena durch das Programm selbst (und nicht durch den Prozessspeichermanager) verwaltet wird; Wird zur Komprimierung und Serialisierung komplexer Datenstrukturen und Objekte oder zur Speicherverwaltung in sicherheitskritischen und / oder fehlertoleranten Systemen verwendet.

Kann jemand in diesen Kontexten eine Arena für mich definieren ?


Wie heißt das Buch?
Yaobin

1
@yaobin Speicher als Programmierkonzept in C und C ++ von Frantisek Franek.
Nocturno

Antworten:


109

Eine Arena ist nur ein großes, zusammenhängendes Speicherelement, das Sie einmal zuweisen und dann zum manuellen Verwalten des Speichers verwenden, indem Sie Teile dieses Speichers verteilen. Beispielsweise:

char * arena = malloc(HUGE_NUMBER);

unsigned int current = 0;

void * my_malloc(size_t n) { current += n; return arena + current - n; }

Der Punkt ist, dass Sie die volle Kontrolle darüber haben, wie die Speicherzuordnung funktioniert. Das einzige, was außerhalb Ihrer Kontrolle liegt, ist der einzelne Bibliotheksaufruf für die anfängliche Zuordnung.

Ein beliebter Anwendungsfall ist, dass in jeder Arena nur Speicherblöcke mit einer einzigen festen Größe zugewiesen werden. In diesem Fall können Sie sehr effiziente Reklamationsalgorithmen schreiben. Ein weiterer Anwendungsfall besteht darin, eine Arena pro "Aufgabe" zu haben. Wenn Sie mit der Aufgabe fertig sind, können Sie die gesamte Arena auf einmal freigeben und müssen sich nicht um die Verfolgung einzelner Freigaben kümmern.

Jede dieser Techniken ist sehr spezialisiert und im Allgemeinen nur dann nützlich, wenn Sie genau wissen, was Sie tun und warum die normale Bibliothekszuordnung nicht gut genug ist. Beachten Sie, dass ein guter Speicherzuweiser selbst bereits viel Magie ausführt, und Sie benötigen eine angemessene Menge an Beweisen dafür, dass dies nicht gut genug ist, bevor Sie selbst mit dem Speicher umgehen.


25
Es ist eine gute Antwort, aber bitte erwägen Sie, den letzten Absatz zu löschen oder zu ändern. Sie brauchen wirklich überhaupt keine Beweise. Jedes Mal, wenn Sie wissen, wie Sie Speicher verwenden, kennen Sie mehr als einen "guten" Allzweck-Allokator. Wenn Sie dieses Wissen verwenden, gewinnt Ihr benutzerdefinierter Allokator immer. Allokatoren sind keine Magie. Eine Arena ist nützlich, wenn Sie viele Gegenstände haben, die alle zum gleichen, genau definierten Zeitpunkt sterben. Das ist so ziemlich alles, was Sie wissen müssen. Das ist kein Hexenwerk.
Andreas Haferburg

11
@AndreasHaferburg: Der Speicherzuweiser aus der Standardbibliothek hat automatisch einen massiven Vorteil gegenüber dem benutzerdefinierten Schreiben Ihrer eigenen, nämlich dass Sie nicht schreiben / testen / debuggen / warten müssen usw. Auch wenn Sie sicher sind, dass Sie keine Beweise dafür haben Wenn Sie die Leistung verbessern können, indem Sie Ihre eigene Zuordnung verwalten, benötigen Sie noch gute Beweise, bevor Sie entscheiden, dass diese Verbesserung den Kompromiss wert ist.
Ruakh

17
@ruakh Ich mag diese Sache mit der Frachtkult-Mentalität einfach nicht, die sich millionenfach überall als "Weisheit" wiederholt. "Die Götter von C ++ haben es uns gegeben, also müssen wir es benutzen." Und mein Favorit: "Es ist Magie." Nein, es ist keine Magie. Es ist nur ein Algorithmus, der so einfach ist, dass sogar ein Computer ihn ausführen kann. In meinem Buch ist das ziemlich weit von Magie entfernt. Meine Vermutung: Sie unterschätzen, wie stark sich die Speicherzuweisung auf die Leistung auswirken kann, und überschätzen, wie kompliziert Arenen sind. Ob Leistung wichtiger ist als Entwicklerzeit, ist eine Geschäftsentscheidung, die in SO etwas sinnlos diskutiert werden kann.
Andreas Haferburg

8
@AndreasHaferburg: Sicher, tcmalloc verwendet einen bestimmten Algorithmus, und die Idee dahinter ist leicht zu erklären, aber die Implementierung ist immer noch komplex und nicht trivial. Vor allem erfordert es plattformspezifisches Wissen, um die richtige Speicherreihenfolge zu erreichen. Ich benutze "Magie" für Dinge, die entweder vom Benutzer überhaupt nicht portabel geschrieben werden können (wie ein effizienter Mutex oder tcmalloc oder der Typname eines Lambda) oder nur mit extremen Heldentaten (wie std :: function); Ich meine es nicht als "kann nicht verstanden werden".
Kerrek SB

12
@AndreasHaferburg: Und mein letzter Rat lautet nicht so sehr, dass es im Prinzip schwierig ist, "besser als die Standardeinstellung zu wissen", sondern dass die Kosten für die Wartung einer benutzerdefinierten Lösung hoch sind (jemand muss sie schreiben, dokumentieren, erhalten Richtig, und jemand anderes muss die Fehler beheben, und jeder muss die ursprünglichen Annahmen überprüfen und erneut überprüfen, wenn sich die Nutzung ausbreitet. Außerdem müssen Sie Beweise benötigen, um diese Kosten zu rechtfertigen.
Kerrek SB

10

Ich werde mit diesem als mögliche Antwort gehen.

•Memory Arena (also known as break space)--the area where dynamic runtime memory is stored. The memory arena consists of the heap and unused memory. The heap is where all user-allocated memory is located. The heap grows up from a lower memory address to a higher memory address.

Ich werde die Synonyme von Wikipedia hinzufügen : Region, Zone, Arena, Gebiet oder Speicherkontext.

Grundsätzlich ist es Speicher, den Sie vom Betriebssystem erhalten und aufteilen und der dann auf einmal freigegeben werden kann. Dies hat den Vorteil, dass wiederholte kleine Aufrufe malloc()teuer sein können (Jede Speicherzuweisung hat Leistungskosten: die Zeit, die zum Zuweisen des Speichers im logischen Adressraum Ihres Programms benötigt wird, und die Zeit, die zum Zuweisen dieses Adressraums zum physischen Speicher benötigt wird) Wo, als ob Sie einen Ballpark kennen, können Sie sich einen großen Teil des Gedächtnisses sichern und es dann an Ihre Variablen weitergeben, wie / wie Sie es brauchen.


5

Betrachten Sie es als Synonym für "Haufen". Normalerweise hat Ihr Prozess nur einen Heap / eine Arena, und die gesamte Speicherzuweisung erfolgt von dort aus.

Manchmal haben Sie jedoch die Situation, dass Sie eine Reihe von Zuordnungen zusammenfassen (z. B. zur Leistung, um Fragmentierung zu vermeiden usw.). In diesem Fall ist es besser, einen neuen Heap / eine neue Arena zuzuweisen, und dann können Sie für jede Zuordnung entscheiden, von welchem ​​Heap Sie zuordnen möchten.

Beispielsweise haben Sie möglicherweise ein Partikelsystem, in dem viele Objekte derselben Größe häufig zugewiesen und freigegeben werden. Um eine Fragmentierung des Speichers zu vermeiden, können Sie jedes Partikel einem Heap zuordnen, der nur für diese Partikel verwendet wird. Alle anderen Zuordnungen stammen aus dem Standardheap.


5

Von http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html :

Die gemeinsam genutzte Bibliothek libc.so.x enthält die glibc-Komponente und den Heap-Code. Die aktuelle Implementierung des Heaps verwendet mehrere unabhängige Sub-Heaps, die als Arenen bezeichnet werden. Jede Arena verfügt über einen eigenen Mutex zum Schutz der Parallelität. Wenn also innerhalb eines Prozess-Heaps genügend Arenen vorhanden sind und ein Mechanismus zum gleichmäßigen Verteilen der Heap-Zugriffe der Threads zwischen ihnen vorhanden ist, sollte das Konfliktpotential für die Mutexe minimal sein. Es stellt sich heraus, dass dies für Zuordnungen gut funktioniert. In malloc () wird getestet, ob der Mutex für die aktuelle Zielarena für den aktuellen Thread frei ist (trylock). Wenn ja, ist die Arena jetzt gesperrt und die Zuweisung wird fortgesetzt. Wenn der Mutex beschäftigt ist, wird jede verbleibende Arena nacheinander ausprobiert und verwendet, wenn der Mutex nicht beschäftigt ist. Für den Fall, dass keine Arena ohne Blockierung gesperrt werden kann, wird eine neue Arena erstellt. Diese Arena ist per Definition noch nicht gesperrt, sodass die Zuordnung jetzt ohne Blockierung fortgesetzt werden kann. Zuletzt wird die ID der Arena, die zuletzt von einem Thread verwendet wurde, im lokalen Thread-Speicher beibehalten und anschließend als erste Arena verwendet, um zu versuchen, wann malloc () das nächste Mal von diesem Thread aufgerufen wird. Daher werden alle Aufrufe von malloc () ohne Blockierung fortgesetzt.

Sie können auch auf diesen Link verweisen:

http://www.codeproject.com/Articles/44850/Arena-Allocator-DTOR-and-Embedded-Preallocated-Buf


3
Zu Ihrer Information, wenn Sie Links veröffentlichen, sollten Sie eine Zusammenfassung veröffentlichen, damit Ihr Beitrag immer noch nützlich ist, wenn der verlinkte Artikel nicht mehr angezeigt wird.
Steinmetz

5
Dies scheint ein Copy-Paste von bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html zu sein. Bitte schreiben Sie Ihre Quellen gut, wenn Sie sie wörtlich verwenden.
Jscs
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.