Feststellen, wieviel freier Arbeitsspeicher vorhanden ist



  • Moin,
    ich suche eine Möglichkeit, dass mein C-Programm ermitteln kann, wieviel freien Arbeitsspeicher ich (noch) habe. Ich habe ein Programm gefunden, das mit Hilfe von malloc() den kompletten Speicher schrittweise reserviert und dabei mitzählt. Das Funktioniert aber nur bei Systemen, die "virtuellen" Speicher NICHT kennen. Weiss da einer Rat?
    Danke.
    Gruß
    had



  • also ich denke mal, dass es günstiger ist, da Systemfunktionen zu nutzen..



  • DocJunioR schrieb:

    also ich denke mal, dass es günstiger ist, da Systemfunktionen zu nutzen..

    Das auf jeden Fall. Man stelle sich mal vor, dass genau bei der Ermittlung über malloc() auch ein anderes Programm versucht Speicher zu reservieren und dadurch natürlich keinen mehr bekommt. So und nun laufen in einem Multitasking-System nicht nur zwei Programme gleichzeitig.

    @had
    Um welches Betriebssystem handelt es sich denn?



  • Moin,
    es handelt sich um WinXP. Systemprogramm klingt gut, aber welches? (Bin da nicht so bewandert ...) Sollte den Wert nummerisch raus geben.
    Gruß
    had



  • Ham,

    die Frage ist auf ANSI C bezogen nur mit malloc() zu erledigen, mit allen damit einhergehenden Gefahren.

    Bei darunterliegenden Betriebssystemen sind ebendiese für die Bereitstellung von Speicher verantwortlich und entsprechend vage fällt deren Antwort aus. Meinst Du echtes RAM oder virtuellen Speicher, der über die Platte geswappt wird? 1,5 GB freier Speicher gemeldet heißt nicht, daß das noch zu einer sinnvollen Betriebssituation führt.

    Da mußt Du schon das Manual zu Deiner Arbeitsumgebung befragen, welche API- calls sie handlich aufbereitet anbietet.

    Aber mit reinem ANSI C gibt's da nix Sinnvolles:
    Wieviel Arbeitsspeicher? - Hoffentlich genug!



  • btw: malloc() wird auf nahezu allen modernen Betriebssystemen nur dann einen Fehler liefern, wenn mehr Speicher angefordert wird, als virtueller Speicher da ist. Man kann also höchstens den gesamten Speichern so herausfinden - den freien aber nicht.

    Hintergrund:
    moderne Betriebssysteme betreiben ein 'lazy commit' - dh, sie sagen dem Programm immer zu, dass genug Speicher da ist, auch wenn das garnicht stimmen soll. Sie gehen nämlich davon aus, dass der Speicher nicht sofort vollgeschrieben wird und sie so noch Zeit haben, den Speicher anderweitig zu besorgen (zB indem ein anderes Programm sich selbst beendet).

    Einzige Lösung: sofort den Speicher voll schreiben.
    dh, immer malloc(1); machen und in den Speicher schreiben, dann weiter.
    Nur bekommt man so wahrscheinlich auch nur eine ungefähre Schätzung - denn malloc muss ja nicht exakt 1 Byte reservieren...

    Fazit:
    Die Funktionen des Betriebssystems verwenden.



  • Bezieht sich zwar auf C++, vielleicht kannste ja trotzdem was damit anfangen.

    Quelle schrieb:

    http://www.cpp-programming.de/

    #include <windows.h>
    #include <conio.h>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      MEMORYSTATUS lpBuffer;
      lpBuffer.dwLength = sizeof(MEMORYSTATUS);
      GlobalMemoryStatus (&lpBuffer);
    
      cout<<"Prozent benutzter Arbeitsspeicher: "
          <<lpBuffer.dwMemoryLoad<<"%"<<endl
    
          <<"Prozent freier Arbeitsspeicher:    "
          <<100-lpBuffer.dwMemoryLoad<<"%"<<endl
    
          <<"Gesamter Arbeitsspeicher :         "
          <<lpBuffer.dwTotalPhys/1024/1024<<"MB"<<endl
    
          <<"Freier  Arbeitsspeicher:           "
          <<lpBuffer.dwAvailPhys/1024/1024<<"MB";
    
      getch();
      return 0;
    }
    

Anmelden zum Antworten