7 Stimmen

Was sind Out-of-Memory-Handling-Strategien in der C-Programmierung?

Eine Strategie, die ich mir selbst überlegt habe, besteht darin, beim Start des Programms 5 Megabyte Speicher (oder eine beliebige andere Zahl, die Sie für notwendig halten) zuzuweisen.

Wenn dann an irgendeinem Punkt das malloc() des Programms NULL zurückgibt, geben Sie die 5 Megabyte frei und rufen malloc() erneut auf, was erfolgreich ist und das Programm weiterhin ausführen lässt.

Was halten Sie von dieser Strategie?

Und welche anderen Strategien kennen Sie?

Vielen Dank, Boda Cydo.

14voto

Behandle malloc-Ausfälle, indem du auf elegante Weise beendest. Mit modernen Betriebssystemen, Auslagerungsdateien usw. sollte man nie vorbeugend auf Speicherausfälle vorbereitet sein, sondern einfach elegant beenden. Es ist unwahrscheinlich, dass du jemals Speicherfehler auftreten werden, es sei denn, du hast ein algorithmisches Problem.

Außerdem ist es wahnsinnig, ohne Grund 5MB bei der Programmausführung zuzuweisen.

5voto

Sparky Punkte 12693

In den letzten Jahren erlaubt die (eingebettete) Software, mit der ich gearbeitet habe, im Allgemeinen nicht die Verwendung von malloc(). Die einzige Ausnahme ist, dass es während der Initialisierungsphase zulässig ist, aber sobald entschieden wurde, dass keine weiteren Speicherzuweisungen mehr erlaubt sind, schlagen alle zukünftigen Aufrufe von malloc() fehl. Da der Speicher aufgrund von malloc()/free() fragmentiert werden kann, wird es in vielen Fällen schwierig, zu beweisen, dass zukünftige Aufrufe von malloc() nicht fehlschlagen werden.

Ein solches Szenario trifft möglicherweise nicht auf Ihren Fall zu. Es kann jedoch nützlich sein, zu wissen, warum malloc() fehlschlägt. Die folgende Technik, die wir in unserem Code verwenden, da malloc() im Allgemeinen nicht verfügbar ist, könnte (oder könnte auch nicht) auf Ihr Szenario anwendbar sein.

Wir verlassen uns tendenziell auf Memory Pools. Der Speicher für jeden Pool wird während der transienten Startphase zugewiesen. Sobald wir die Pools haben, nehmen wir einen Eintrag aus dem Pool, wenn wir ihn benötigen, und geben ihn zurück, wenn wir fertig sind. Jeder Pool ist konfigurierbar und normalerweise für einen bestimmten Objekttyp reserviert. Wir können die Nutzung jedes einzelnen Pools im Laufe der Zeit verfolgen. Wenn uns die Pool-Einträge ausgehen, können wir herausfinden, warum dies der Fall ist. Wenn nicht, haben wir die Möglichkeit, unseren Pool zu verkleinern und Ressourcen zu sparen.

Ich hoffe, das hilft.

2voto

Jerry Coffin Punkte 452852

Als Methode zur Überprüfung, dass Sie Speichersituationen elegant handhaben, kann dies eine durchaus nützliche Technik sein.

Unter allen anderen Umständen klingt es bestenfalls nutzlos. Sie verursachen die Speichersituation, um dann das Problem zu beheben, indem Sie Speicher freigeben, den Sie nicht benötigt haben.

2voto

nos Punkte 214143

"try-again-later". Nur weil du jetzt OOM bist, bedeutet das nicht, dass du es später sein wirst, wenn das System weniger beschäftigt ist.

void *smalloc(size_t size) {
   for(int i = 0; i < 100; i++) {
      void *p = malloc(size);
      if(p) 
        return p;
      sleep(1);
    }
   return NULL;
}

Natürlich sollten Sie gut überlegen, wo Sie eine solche Strategie einsetzen, da sie ziemlich hässlich ist, aber sie hat einige unserer Systeme in verschiedenen Fällen gerettet

1voto

Drakosha Punkte 11577

Es hängt tatsächlich von einer Richtlinie ab, die Sie implementieren möchten, das heißt, was das erwartete Verhalten Ihres Programms ist, wenn es keinen Speicher mehr hat.

Die beste Lösung wäre, Speicher nur während der Initialisierung zuzuweisen und niemals während der Laufzeit. In diesem Fall läuft Ihnen nie der Speicher aus, wenn das Programm es schafft zu starten.

Eine andere Möglichkeit wäre das Freigeben von Ressourcen, wenn Sie das Speicherlimit erreichen. Dies wäre schwierig zu implementieren und zu testen.

Denken Sie daran, dass wenn Sie von malloc NULL erhalten, dies bedeutet, dass sowohl physischer als auch virtueller Speicher keinen freien Speicherplatz mehr haben, was bedeutet, dass Ihr Programm die ganze Zeit ausgelagert wird, wodurch es langsam wird und der Computer unresponsive.

Sie müssen tatsächlich sicherstellen (durch geschätzte Berechnung oder Überprüfung des Speicherbedarfs zur Laufzeit), dass die erwartete Menge an freiem Speicher, die der Computer hat, für Ihr Programm ausreicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X