7 Stimmen

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

Eine Strategie, die mir selbst eingefallen ist, besteht darin, beim Programmstart 5 Megabyte Speicher (oder eine beliebige Zahl, die Sie für notwendig halten) zuzuweisen.

Wenn das Programm an einem beliebigen Punkt malloc() gibt zurück. NULL geben Sie die 5 Megabyte frei und rufen malloc() erneut, was zum Erfolg führt und das Programm weiterlaufen lässt.

Was halten Sie von dieser Strategie?

Und welche anderen Strategien kennen Sie?

Danke, Boda Cydo.

14voto

Behandlung von malloc-Fehlern durch ordnungsgemäßes Beenden. Bei modernen Betriebssystemen, Auslagerungsdateien usw. sollten Sie sich nie präventiv auf einen Speicherausfall einstellen, sondern sich einfach elegant zurückziehen. Es ist unwahrscheinlich, dass Sie jemals auf Speicherplatzmangel stoßen werden, es sei denn, Sie haben ein algorithmisches Problem.

Außerdem ist es unsinnig, beim Start 5 MB ohne Grund zuzuweisen.

5voto

Sparky Punkte 12693

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

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

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

Ich hoffe, das hilft.

2voto

Jerry Coffin Punkte 452852

Als Methode zum Testen, dass Sie Situationen, in denen der Speicher nicht ausreicht, angemessen behandeln, kann dies eine recht nützliche Technik sein.

Unter allen anderen Umständen klingt es bestenfalls nutzlos. Sie verursachen die Situation, dass der Speicher nicht ausreicht, und beheben dann das Problem, indem Sie Speicher freigeben, den Sie zu Beginn nicht benötigten.

2voto

nos Punkte 214143

"Versuch es später noch einmal". Nur weil Sie jetzt nicht erreichbar sind, heißt das nicht, dass Sie es später sein werden, wenn das System weniger ausgelastet 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 sollte man sich gut überlegen, wo man eine solche Strategie einsetzt, denn sie ist ziemlich heimtückisch, aber sie hat einige unserer Systeme in verschiedenen Fällen gerettet

1voto

Drakosha Punkte 11577

Das hängt von der Richtlinie ab, die Sie implementieren möchten, d. h. davon, welches Verhalten von Ihrem Programm erwartet wird, wenn der Speicher erschöpft ist.

Eine gute Lösung wäre es, Speicher nur während der Initialisierung und niemals während der Laufzeit zuzuweisen. In diesem Fall geht Ihnen nie der Speicher aus, wenn das Programm starten kann.

Eine weitere Möglichkeit ist die Freigabe von Ressourcen, wenn die Speichergrenze erreicht ist. Das wäre schwierig zu implementieren und zu testen.

Denken Sie daran, dass Sie, wenn Sie sich NULL de malloc bedeutet dies, dass sowohl der physische als auch der virtuelle Speicher keinen freien Platz mehr haben, was bedeutet, dass Ihr Programm ständig ausgelagert wird, wodurch es langsam wird und der Computer nicht mehr reagiert.

Sie müssen sich vergewissern (durch überschlägige Berechnung oder durch Überprüfung der Speichermenge zur Laufzeit), dass die erwartete Menge an freiem Speicher auf dem Computer für Ihr Programm ausreichend ist.

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