Memory Pool



  • Hallo,

    ich benötige für mein Programm einen Memory Pool.

    Was soll dieser Memory Pool können? Ganz naiv gedacht: Ich möche einen Prozentsatz X des momentan frei verfügbaren Speichers für mich allokieren. Am Ende des Programmes wieder dieser große Haufen wieder freigegeben.

    Alle Allokationen sollen über diesen Pool erfolgen, sodass das Programm zwischen Start und Ende nie mehr Speicher allokieren / freigeben muss.

    Ein Ansatz wäre folgender:
    Man allokiert mehre Pages á n-Byte. Am Anfang jeder Page stehen Informationen übre diese:

    struct MemoryPage
    {
        size_t size,
        void*  nextFree,
        // ...
    };
    

    Das Probelm ist jedoch, dass man sich zu Beginn jedes vom Programm allokierten Speichers auch die Größe merken müsste. Soll heißen, man würde nicht den wirklich allokierten Speicher alleine reservieren, sondern ebenfalls den Bereich der für diese Metadaten verantwortlich ist.
    Diese würde dann eben an der Stelle "ReceivedPointer" - sizeof(struct) liegen.

    Sollten jetzt aber viele kleine Allokationen - extrem Fall nur 1 Byte -erfolgen, nimmt der Platz für diese Verwaltung mehr ein als die Nutzdaten.

    Ein zweiter Ansatz wäre, die globalen Operatoren new/new[] und delete/delete[] (sowie Überladungen) zu ersetzen, welche dann intern den Memory Pool aufrufen würden, welcher aber erst dann Just-In-Time den Speicher allokieren würde.

    Der allokierte Speicher würde allerdings NICHT wieder freigegeben werden, sondern erst dann, wenn der (vorher gesetzte) new_handler aufgerufen wird, wird versucht Speicher aufzuräumen. Ansonsten würde der Aufruf von delete nur ein Flag setzen, dass der Speicher wieder "zu haben" ist.

    Das System hätte den Vorteil, dass es wirklich Speicher-Blöcke beinhalten würde, die genau so von meinem Programm genutzt werden. Beim System weiter oben, ist es ja gerade die Schwierigkeit die optimale Größe zu finden.

    ___
    Hat da jemand eine Inspiration für mich? Ich habe mir im Web bereits einige Memory Pools angeschaut, die aber recht schnell viele Schwachstellen aufweißen.

    Danke im Voraus.



  • PS:

    template <size_t Sz>
    class MemoryPool {
    public:
      static void* allocate();
      static void deallocate(void*);
    };
    

    Diese Technik ist zunächst vielversprechend. Allerdings ist die Größe der meisten Allokationen in meinem Programm dynamisch und daher zur Kompilierzeit nicht auswertbar ...



  • Bei Compilezeitbekannter Größe mach doch einfach einen Buddy-Allokator. Hau für kleine Größen nach Belieben noch Small-Object-Allocators drüber.

    Ein Memory-Pool ist eigentlich einer, wo man gar nicht löschen muß, weil man keine C++-Objektre mit Destruktor reintut. Und bei Auftragsende kann man ihn einfach komplett wegwerfen.



  • FrEEzE2046 schrieb:

    Hallo,

    ich benötige für mein Programm einen Memory Pool.

    Warum?



  • erzähl schrieb:

    FrEEzE2046 schrieb:

    ich benötige für mein Programm einen Memory Pool.

    Warum?

    Weil mein Programm zwingend 80% des Hauptspeichers allokieren soll. Es wird mit vielen Dateien gehandelt, welche gepuffert werden und nicht komplett in den Speicher passen. Ist kein Platz mehr im Pool frei, soll das Objekt, was am wenigsten bzw. am längsten nicht mehr gebraucht worden ist Platz für ein neues machen.

    Es muss nicht ständig neu allokiert / freigegeben werden.



  • FrEEzE2046 schrieb:

    erzähl schrieb:

    FrEEzE2046 schrieb:

    ich benötige für mein Programm einen Memory Pool.

    Warum?

    Weil mein Programm zwingend 80% des Hauptspeichers allokieren soll.

    Auf nem normalen Rechner würdest du dir irgendwas zwischen 1 und 15 GB Speicher holen, auf nem Server vlt. 100 GB. Ist das irgendwie sinnvoll?



  • erzähl schrieb:

    Auf nem normalen Rechner würdest du dir irgendwas zwischen 1 und 15 GB Speicher holen, auf nem Server vlt. 100 GB. Ist das irgendwie sinnvoll?

    Nein, DAS wäre nicht sinnvoll. Ich entwickele aber für firmeninterne Hardware die ich genau kenne und da habe ich immer 512 - max. 2048 MB. Abgesehen davon ist mein Programm das einzige, was neben dem OS ausgeführt wird.



  • Wenn nur dein Programm auf dem Rechner lauft ist ja sonst keine da der dir den Speicher weg nehmen kann und du brauchst doch nicht von Anfang an alles Reservieren. Mach dir einfach ne Liste mit den geladenen Files und ihrer Größe und wenn die Summe größer 80% ist gibst du wieder welche frei und das Memorymanagement kann das OS machen.


Anmelden zum Antworten