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

Lesezeit: 8 Minuten

Benutzeravatar von Nocturno
Nacht

Ich lese ein Buch über Gedächtnis als Programmierkonzept. In einem der späteren Kapitel macht der Autor starken Gebrauch von dem Wort Arena, definiert es aber nie. Ich habe nach der Bedeutung des Wortes und seiner Beziehung zur Erinnerung gesucht und nichts gefunden. Hier sind einige Kontexte, in denen der Autor den Begriff verwendet:

„Das nächste Beispiel der Serialisierung beinhaltet eine Strategie namens Speicherzuweisung von einem bestimmten Arena.”

“…dies ist nützlich, wenn es um Speicherlecks geht oder wenn von einem bestimmten Speicher zugewiesen wird Arena.”

“… wenn wir den Speicher freigeben wollen, dann werden wir das Ganze freigeben Arena.”

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

Zuweisung aus der Arena – Technik, zunächst eine Arena zuzuweisen und dann die Zuweisung/Aufhebung der Zuweisung innerhalb der Arena durch das Programm selbst zu verwalten (statt durch den Prozessspeichermanager); Wird zur Komprimierung und Serialisierung komplexer Datenstrukturen und Objekte oder zur Speicherverwaltung in sicherheitskritischen und / oder fehlertoleranten Systemen verwendet.

Kann jemand definieren Arena für mich angesichts dieser Kontexte?

  • Wie heißt das Buch?

    – Jaobin

    13. November 2018 um 19:31 Uhr

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

    – Nachtturno

    13. November 2018 um 20:26 Uhr

Eine Arena ist nur ein großes, zusammenhängendes Stück Speicher, das Sie einmal zuweisen und dann verwenden, um den Speicher manuell zu verwalten, indem Sie Teile dieses Speichers ausgeben. Zum Beispiel:

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 Speicherzuweisung funktioniert. Das Einzige, worauf Sie keinen Einfluss haben, ist der einzelne Bibliotheksaufruf für die anfängliche Zuordnung.

Ein beliebter Anwendungsfall ist, dass jede Arena nur verwendet wird, um Speicherblöcke einer einzigen, festen Größe zuzuweisen. In diesem Fall können Sie sehr effiziente Wiederherstellungsalgorithmen schreiben. Ein weiterer Anwendungsfall besteht darin, eine Arena pro “Aufgabe” zu haben, und 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 nützlich, wenn Sie genau wissen, was Sie tun und warum die normale Bibliothekszuordnung nicht gut genug ist. Beachten Sie, dass ein guter Speicherzuordner bereits selbst eine Menge Magie vollbringt, und Sie brauchen eine anständige Menge an Beweisen, dass dies nicht gut genug ist, bevor Sie anfangen, den Speicher selbst zu handhaben.

  • Es ist eine gute Antwort, aber bitte erwägen Sie, den letzten Absatz zu löschen oder zu ändern. Du brauchst wirklich keine Beweise. Jederzeit wissen Sie wie Sie werden Speicher verwenden, Sie wissen mehr als ein “guter” Allzweckzuordner, und wenn Sie dieses Wissen nutzen, wird Ihr benutzerdefinierter Zuordner immer gewinnen. Allokatoren sind keine Zauberei. 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 Häferburg

    2. April 2016 um 5:35 Uhr

  • @AndreasHaferburg: Der Speicherzuordner 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 sich ohne Beweise sicher sind, dass Sie es tun Leistung verbessern können, indem Sie Ihre eigene Allokation verwalten, benötigen Sie dennoch gute Beweise, bevor Sie entscheiden, dass diese Verbesserung den Kompromiss wert ist.

    – ruach

    1. Oktober 2016 um 19:03 Uhr

  • @ruakh Ich mag diese Cargo-Kult-Mentalität einfach nicht, die überall millionenfach als “Weisheit” wiederholt wird. “Die Götter von C++ haben es uns gegeben, also müssen wir es benutzen.” Und mein Favorit: “It’s magic.” Nein. Es ist keine Magie. Es ist nur ein Algorithmus, der so einfach ist, dass sogar ein Computer ihn ausführen kann. Meiner Meinung nach 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 die Leistung wichtiger ist als die Entwicklerzeit, ist eine geschäftliche Entscheidung, die auf SO wenig sinnlos zu diskutieren ist.

    – Andreas Häferburg

    2. Oktober 2016 um 11:32 Uhr

  • @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. Am wichtigsten ist, dass plattformspezifisches Wissen erforderlich ist, um die richtige Speicherreihenfolge zu finden. Ich verwende “magic” für Dinge, die vom Benutzer entweder überhaupt nicht portierbar sind (wie ein effizienter Mutex oder tcmalloc oder der Typname eines Lambda) oder nur mit extremen Heldentaten (wie std::function); Ich meine das nicht mit “unverständlich”.

    – Kerrek SB

    2. Oktober 2016 um 12:49 Uhr

  • @AndreasHaferburg: Und mein letzter Rat ist nicht so sehr zu sagen, dass es im Prinzip schwer ist, “besser als den Standard zu wissen”, sondern dass die Kosten für die Wartung einer benutzerdefinierten Lösung hoch sind (jemand muss sie schreiben, dokumentieren, bekommen stimmt, und jemand anderes muss die Fehler beheben, und jeder muss die ursprünglichen Annahmen überprüfen und erneut verifizieren, wenn sich die Nutzung ausbreitet), und dass Sie Beweise benötigen, um diese Kosten zu rechtfertigen.

    – Kerrek SB

    2. Oktober 2016 um 12:50 Uhr


Mikes Benutzeravatar
Mike

Ich werde mit diesem gehen als mögliche Antwort.

•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 hinzufügen Wikipedias Synonyme: Region, Zone, Arena, Bereich oder Speicherkontext.

Im Grunde handelt es sich um Speicher, den Sie vom Betriebssystem erhalten und aufteilen, der dann auf einmal freigegeben werden kann. Der Vorteil dabei ist, dass wiederholte kleine Anrufe anfallen malloc() könnte kostspielig sein (Jede Speicherzuweisung hat Leistungskosten: die Zeit, die benötigt wird, um den Speicher im logischen Adressraum Ihres Programms zuzuweisen, und die Zeit, die benötigt wird, um diesen Adressraum dem physischen Speicher zuzuweisen), wo Sie, als ob Sie einen Ballpark kennen, können Holen Sie sich einen großen Teil des Speichers und verteilen Sie ihn dann an Ihre Variablen, wie Sie ihn benötigen.

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.

Aber manchmal haben Sie eine Situation, in der Sie eine Reihe von Zuweisungen gruppieren würden (z. B. für die 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 Zuweisung entscheiden, von welchem ​​Heap die Zuweisung erfolgen soll.

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önnten Sie jedem Partikel einen Heap zuweisen, der nur für diese Partikel verwendet wird, und alle anderen Zuweisungen würden vom Standard-Heap stammen.

Benutzeravatar von Rahul Tripathi
Rahul Tripathi

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

Die gemeinsam genutzte Bibliothek libc.so.x enthält die glibc-Komponente und darin befindet sich der Heap-Code. Die aktuelle Implementierung des Heaps verwendet mehrere unabhängige Sub-Heaps, die Arenen genannt werden. Jede Arena hat ihren eigenen Mutex für den Parallelitätsschutz. Wenn also genügend Arenen innerhalb des Heaps eines Prozesses vorhanden sind und ein Mechanismus vorhanden ist, um die Heap-Zugriffe der Threads gleichmäßig zwischen ihnen zu verteilen, dann sollte das Konfliktpotential für die Mutexe minimal sein. Es stellt sich heraus, dass dies für Zuordnungen gut funktioniert. In malloc() wird geprüft, ob der Mutex für den aktuellen Zielbereich für den aktuellen Thread frei ist (Trylock). Wenn dies der Fall ist, wird die Arena nun gesperrt und die Zuweisung wird fortgesetzt. Wenn der Mutex beschäftigt ist, wird jede verbleibende Arena der Reihe nach ausprobiert und verwendet, wenn der Mutex nicht beschäftigt ist. Für den Fall, dass keine Arena ohne Sperrung gesperrt werden kann, wird eine frische neue Arena erstellt. Diese Arena ist per Definition noch nicht gesperrt, sodass die Zuteilung nun ohne Sperrung erfolgen kann. Schließlich wird die ID der Arena, die zuletzt von einem Thread verwendet wurde, im Thread-Lokalspeicher gehalten und anschließend als die erste Arena verwendet, die versucht wird, wenn 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

Teilen Sie mit, was ich über dieses Problem gelernt habe. (Die Antwort basiert auf glibc malloc).

arena und heap sind zwei unterschiedliche Datenstrukturen für die Speicherverwaltung. Und sie arbeiten auf verschiedenen Ebenen: arena ist in der höheren Ebene.

Arena
Eine Struktur, die von einem oder mehreren Threads gemeinsam genutzt wird und enthält references to one or more heaps. Standardmäßig hat jeder Prozess mindestens eine Arena, die main arena die vom Hauptthread erstellt wird. Und für Multi-Thread-Programme gibt es mehrere Arenen (genannt Thread-Arena). Aber es gibt keine Eins-zu-Eins-Mapping-Beziehung zwischen Thread und Arena. Da es eine Obergrenze für die Anzahl der Arenen wie folgt gibt:

For 32 bit systems:
     Number of arena = 2 * number of cores.
For 64 bit systems:
     Number of arena = 8 * number of cores.

Die Thread-Arena kann mehrere Haufen enthalten, aber die Hauptarena hat nicht mehrere Haufen.

Haufen
Ein zusammenhängender Speicherbereich, der in zuzuweisende Chunks unterteilt ist. Each heap belongs to exactly one arena.

Geben Sie hier die Bildbeschreibung ein

1423760cookie-checkWas bedeutet der Begriff Arena in Bezug auf das Gedächtnis?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy