Wie finde ich heraus, wie viel freier Speicherplatz in GNU C ++ auf Linux bleibt

StackOverflow https://stackoverflow.com/questions/391107

  •  23-08-2019
  •  | 
  •  

Frage

Ich schreibe ein C ++ Programm (kompiliert mit gcc und läuft auf RedHat Linux). Das Programm muss zur Laufzeit wissen, wie viel Platz auf dem Stapel gelassen wird und wie viel in der Halde links. Ich weiß, es gibt keine definitive Antwort auf diese Frage (über den Haufen) sein kann, so alternativ ich die Größe des Speichers bereits aus dem Heap statt zugeordnet nutzen könnte. Gibt es eine Bibliothek / Systemfunktionsaufruf, der mir diese Daten geben werden?

Ich möchte hinzufügen, dass ich dies nur für Debugging-Zwecke, und müssen nur grobe Schätzungen, so schnell und unsaubere Lösungen sind durchaus akzeptabel. Ich brauche aber sehr häufig die Speicherauslastung abzufragen, so zu einem cmd-Zeilenprogramm Unix Beschuss aus und Parsen seiner Ausgabe nicht akzeptabel ist.

Keine korrekte Lösung

Andere Tipps

wahrscheinlich Sie können Ihre eigene neue erstellen und Funktionen löschen, die wirklich neue und löschen Operatoren kapselt und notieren Sie die Speichernutzung bei gleichzeitig.

Für Stapel, gibt es einen Trick in C, wo man an der Adresse der ersten lokalen Variablen einen Blick definiert in der aktuellen Funktion eine grobe Vorstellung zu bekommen, wo der Stapelzeiger ist im Moment. Ich denke, es sollte in C ++ arbeiten, aber habe es nicht versucht.

auf Linux können Sie lesen / proc / pid / status

Beachten Sie, dass auf 32-Bit-Systemen wird der Stapel nach unten wächst und der Haufen wächst nach oben, und die beiden vielleicht irgendwo in der Mitte treffen. Der Raum könnte daher zugeordnet wird zur gleichen Zeit sowohl zu stapeln oder Haufen, aber nicht. Beachten Sie, dass Shared-Memory-Segmente (wenn Sie sie verwenden), um die Speicherkarte erschweren. So kann dynamisch geladen (gemeinsam) Bibliotheken.

+------------+
|    stack   | high addresses
|      |     |
|      v     |
+------------+
|            |
|   unused   |
|            |
+------------+
|            |
|      ^     |
|      |     |
|    heap    |
|            |
+------------+
|            |
|     bss    |
|            |
+------------+
|            |
|    data    |
|            |
+------------+
|            |
|    text    |
|            | low addresses
+------------+

Auf einem 64-Bit-System, gibt es genug Adressraum, reale und virtuelle Speicher ausgeführt werden, bevor die Kollisionen auftreten.

Beachten Sie auch, dass (zumindest einige Versionen) Linux sind bereit, mehr Speicher zu sagen, kann zugeteilt werden, als sie tatsächlich unterstützen kann - sie über begehen. Das ist nicht sehr gut. Es bedeutet, dass praktische Experimente wie Probespeicherzuordnungen können Sie ein falsches Gefühl der Sicherheit geben.

Wahrscheinlich Sie sind am besten dran fragen ‚ist die x MB (GB?) Platz links‘, anstatt ‚wie viele MB (GB?) Platz gelassen‘. Andere Leute wies auf die /proc Dateisystem als Informationsquelle für wie viel Speicher verwendet wird. Ich bin mir nicht sicher, ob es sagt Ihnen zuverlässig darüber, wie viel Speicher verfügbar zu greifen.

Dies ist eine C-Funktion, die Menge des freien Speichers auf der Himbeere PI zurückzukehren. Es funktioniert durch den / proc / meminfo zu lesen. Ich bin mir nicht sicher, ob es für andere Systeme funktioniert.

#include <stdio.h>
#include <string.h>
// Return the amount of free memory in kbytes.
// Returns -1 if something went wrong.
int getfreememory()
{
  int returnValue;
  const int BUFFER_SIZE = 1000;
  char buffer[BUFFER_SIZE];
  FILE *fInput;
  int loop;
  int len;
  char ch;
  returnValue = -1;
  fInput = fopen("/proc/meminfo","r");
  if (fInput != NULL)
  {
    while (!feof(fInput))
    {
      fgets(buffer,BUFFER_SIZE-1,fInput);
      if (feof(fInput))
      {
        break;
      }
      buffer[BUFFER_SIZE-1] = 0;
      // Look for serial number
      if (strncmp(buffer,"MemFree:",8)==0)
      {
        // Extract mem free from the line.
        for(loop=0;loop<BUFFER_SIZE;loop++)
        {
          ch = buffer[loop];
          if (ch == ':')
          {
             returnValue = 0;
             continue;
          }
          if (ch == 0)
          {
              break;
          }
          if (returnValue >=0)
          {
             if (ch >='A')
             {
                break;
             }
             if ((ch >='0') && (ch <='9'))
             {
                returnValue = returnValue * 10 + (ch-'0');
             }
          }
        }
        break;
      }
    } 
    fclose(fInput);
  }
  return returnValue;
}

Sie können in überprüfen das / proc-Namespace die Dateien / proc / / smaps und / proc / / maps, wobei ist der aktuelle Prozess-ID.

Überprüfen Sie dieser Blogpost aus.

Valgrind Massivs Tool unterstützt sowohl Stack und Heap Profilierung . Möglicherweise möchten Sie den Quellcode überprüfen, um zu sehen, wie sie es tut.

Für den Haufen Teil, vielleicht haben Sie schlagen eine Ressourcengrenze. Schauen Sie sich dieser .

Sie können verwenden Valgrind für Stapel Profilierung, aber was willst du damit tun? Stapel ist wie Heap nicht. Sie sagen, Sie wollen, dass diese Zwecke für die Fehlersuche zu tun. Wenn Ihr Programm fein läuft, dann gibt es kein Problem Stapel (bezogen auf seine Größe zumindest).

Sie können die Stapelgröße für die Fäden legen Sie den Stapelzeigerwert erstellt und kontrollieren, indem der lokalen Variablen suchen (die optimierte-out werden darf) Adressen. Genau das tun, etwas Mathematik durch die Anfangsgröße, Anfangsstapelzeigerwert und aktuellen Stapelzeigerwert verwenden, werden Sie ein paar schöne Zahlen erhalten. Nur vergessen Sie nicht zuerst die Stapelrichtung herauszufinden. Dies kann von Plattform zu Plattform ändern.

Ich denke, wenn man so viel für Heap-Nutzung kümmern, dann wird Ihr Programm wahrscheinlich Speicherlecks. In diesem Fall Valgrind können Sie in die richtige Richtung. Valgrind

getrlimit mit einem Paramater von RLIMIT_STACK wird Ihnen sagen, wie viel Stapelspeicher ist insgesamt gibt. Mit einem Parameter von RLIMIT_AS können Sie herausfinden, wie viel virtueller Speicher vorhanden ist.

Weitere Informationen Blick auf http://linux.die.net/man/2/ getrlimit

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top