Dynamische Speicherverwaltung



  • Hi,
    habe die Tage die Funktionen malloc(), calloc() und realloc() kennengelernt.
    Die Speicherallokierung funktioniert soweit auch, allerdings habe ich noch ein Problem oder einen Denkfehler. Wie kann ich herausfinden, wie viel Speicher "momentan" reserviert werden kann bzw. wie viel Speicher noch zur Verfügung steht?



  • möglich, dass ich falsch liege, aber ich denke, das auslesen des freien/belegten speicherplatzes ist nur mit system-apis möglich.

    mfg,
    julian



  • Kurzfassung: Da gibt es keine Möglichkeit. Du kannst nur feststellen, daß du nicht mehr genug Platz hast (wenn das der Fall ist, liefert malloc() NULL zurück).



  • Erstmal Danke 🙂

    Ich hab folgende Aufgabenstellung:

    "2. Schreiben Sie ein Programm, das testet, wie viel Speicher momentan reserviert werden kann."

    Da es diese Aufgabe schon seit ein paar Schuljahren gibt, muss es doch ne Möglichkeit geben 🙂

    P.S. Wir dürfen aber nur malloc(), calloc() und realloc() benutzen 🙂



  • Interessante Aufgabe. Nur mit malloc lösen?

    Ich würde sagen da kann man höchstens in einer Schleife immer wieder was allokieren, bis malloc NULL zurückgibt. Allerdings wäre danach die korrekte Antwort des Programms "jetzt kann leider nichts mehr reserviert werden" 😃

    Auch ist die Tatsache abhängig davon, wieviel Speicher man am Stück braucht. Nur weil man kein 500 MB großes Stück Speicher mehr bekommt, heisst das noch lange nicht, dass man nicht trotzdem 500 MB in vielen kleinen Stücken bekommen könnte.



  • Lösung soll mittels einer Schleife gemacht werden wie es LordJaxom schon erwähnt hat. Sprich bei jedem Durchlauf Speicher reservieren und erhöhen, wenn malloc() NULL liefert, steht das Ergebnis im letzten Durchlauf 😉
    Theoretisch ist mir schon klar, wie ich die Aufgabe lösen kann/soll.
    In der Praxis ergibt sich jedoch folgendes Problem, mein Programm gibt immer das gleiche Ergebnis aus bzw je Rechner ein "neues" Ergebnis.

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    #include <stdio.h>
    #include <stdlib.h>
    #include <stddef.h>
    
    int main(void)
    {
       int max=1024, i=0;
       char *zahlen=NULL;
    
       /* Start bei 1000MB */                     
       max = max * 1000;
    
       /* Speicher reservieren für 1000*1024 char-Werte mit calloc */
       /* --> */
       zahlen = (char *)calloc(max*1024, sizeof(char));
    
       if( zahlen == NULL )
       {
          printf("Kein RAM mehr vorhanden ... !");
          getch();
          return;
       }
    
       printf("%d. Durchlauf --> ", i+1);    
       printf("Speicherplatz reserviert "
                     " (%d kBytes | %d MB)\n", sizeof(char)*max, sizeof(char)*max/1024);              
    
       i=1;              
       free(zahlen);
    
       /* Endlossschleife */
       while(1 == 1)
       {     
          printf("%d. Durchlauf --> ", i+1);
    
          /* Reservierung von Speicher während der Laufzeit */
          /* des Programms mit realloc */
              max++;
              zahlen = (char *)calloc(max*1024, sizeof(char));
              //zahlen = (double *)realloc(zahlen,max*1024*sizeof(double));
    
              if( zahlen == NULL )
    	      {
                  printf("Kein RAM mehr vorhanden ... !");
                  getch();
                  return;
              }
    
              printf("Speicherplatz reserviert "
                     " (%d kBytes | %d MB)\n", sizeof(char)*max, sizeof(char)*max/1024);
    
          i++;
          free(zahlen);
       }
    
          getch();
          return;
    }
    
    //---------------------------------------------------------------------------
    


  • Erstens: du startest mit max=1024000 (nicht ganz ein MegaByte), das heißt, im ersten ersten Durchlauf reservierst du schon ca. 1 GigaByte Speicher. Ist das beabsichtigt?

    Zweitens: Wieviel Speicher verfügbar ist, hängt von etlichen Faktoren ab, von denen die meisten sich wohl während der Lebensdauer eines Rechners nicht wesentlich ändern.



  • CStoll schrieb:

    Zweitens: Wieviel Speicher verfügbar ist, hängt von etlichen Faktoren ab, von denen die meisten sich wohl während der Lebensdauer eines Rechners nicht wesentlich ändern.

    Ne, aber vom aktuellen Zustand eines PC( d.h. wie viel Speicher z.Zt. durch andere Programme belegt ist )
    Logisch Ne ?



  • Die Aufgabenstellung ist IMHO absoluter Vollstuß 🤡 .
    Im µC- Bereich würde es genügen, HEAPSIZE oder eine ähnliche Systemkonstante auszugeben, mein Tip dann: Probier's mit printf() 😉 !
    Auf Systemen mit virtueller Speicherverwaltung kann man natürlich gern die Platte einen Tag lang mit Swapfile- Swapping abkochen 😡 , es wird dann ungefähr das rauskommen (aber nur ungefähr), was Win als Memory+VirtualMemory anbietet. Das kriegste billiger aus 'nem API- Call.
    'ne DOSe vollmachen, das ist ungefähr das Einzige, wozu das taugen kann, aber VORSICHT, die könnte tatsächlich ab dem ersten NULL unglücklicherweise den Betrieb einstellen 👎



  • CStoll schrieb:
    Erstens: du startest mit max=1024000 (nicht ganz ein MegaByte), das heißt, im ersten ersten Durchlauf reservierst du schon ca. 1 GigaByte Speicher. Ist das beabsichtigt?

    Ja das ist beabsichtigt, deshalb steht ja auch drüber: Start bei 1000MB, denn so ist das Programm etwas schneller fertig. Zahl könnte auch angepasst werden. Wenn ich jedoch bei z.B. 1MB starte, dann kann ich 2h warten bis das Programm am Ende (hier 1909MB ca RAM+Virt.Ram) ist 😃

    CStoll schrieb:
    Zweitens: Wieviel Speicher verfügbar ist, hängt von etlichen Faktoren ab, von denen die meisten sich wohl während der Lebensdauer eines Rechners nicht wesentlich ändern.

    Ich will ja auch nur wissen wieviel Speicher momentan reserviert werden kann und nicht wieviel Arbeitsspeicher im PC "steckt".

    LordJaxom schrieb:
    Auch ist die Tatsache abhängig davon, wieviel Speicher man am Stück braucht. Nur weil man kein 500 MB großes Stück Speicher mehr bekommt, heisst das noch lange nicht, dass man nicht trotzdem 500 MB in vielen kleinen Stücken bekommen könnte.

    Das würde hier zu weit führen 🙂
    Wenn er nicht am Stück verfügbar ist, dann ist er eben nicht verfügbar 🙂

    Es geht nur darum eine Schleife zu starten und Speicher zu reservieren bis calloc(), malloc() oder realloc() NULL zurückgibt.
    Das Ergebnis des letzten Schleifendurchgangs ist dann korrekt.
    Das soll keine perfekte Arbeitsspeicherverwaltung oder ähnliches sein/werden 🙂

    pointercrash() schrieb:
    Die Aufgabenstellung ist IMHO absoluter Vollstuß 🤡 .

    Das sehe ich auch so, aber ich kann sie mir leider nicht aussuchen.

    pointercrash() schrieb:
    Auf Systemen mit virtueller Speicherverwaltung kann man natürlich gern die Platte einen Tag lang mit Swapfile- Swapping abkochen 😡 , es wird dann ungefähr das rauskommen (aber nur ungefähr), was Win als Memory+VirtualMemory anbietet. Das kriegste billiger aus 'nem API- Call.

    Heisst also ich bekomme bei calloc(), malloc() und realloc() den gesamten Speicher(inkl. Virtuellem Ram) im PC angezeigt und nicht den freien Speicher?



  • Moderne OS geben dir Speicher nicht immer gleich. Du kannst zwar sagen: ich will 1 GB Speicher haben, aber du bekommst erstmal nur eine Page (normalerweise 4KB) oder sogar garnichts. Erst wenn du reinschreibst allokiert dir das OS den Speicher.

    Die Idee dahinter ist: du brauchst den Speicher nicht sofort und bis du ihn brauchst, hat eine andere Anwendung vielleicht wieder etwas freigegeben.

    So nun zu dem Problem alles reservieren zu wollen: Ein Moderner PC hat etwa virtuellen Speicher. Das sogenannte Swapen kommt hier dazu. Wenn der physikalische Speicher auslaeuft, werden einfach Speicher Seiten auf die Festplatte geschrieben. Und da kann man theoretisch nahezu unendlich viel Swapplatz anbieten. Problem dabei ist aber, dass es halt sehr langsam wird wenn der PC nur noch am Swapen ist.

    Generell gilt: auf modernen Systemen gibt es keine Out Of Memory Situationen.


Anmelden zum Antworten