SIGKILL beim Zuordnen von Speicher in C ++

8

Ich entwickle eine Anwendung für ein Embedded System mit begrenztem Speicher (Tegra 2) in C ++. Ich behandle NULL-Ergebnisse von new und new[] im gesamten Code, der manchmal auftritt, aber die Anwendung kann damit umgehen.

Das Problem ist, dass das System den Prozess durch SIGKILL beendet, wenn der Speicher vollständig ausgelaufen ist. Kann ich irgendwie sagen, dass new nur NULL zurückgeben sollte anstatt den Prozess zu beenden?

    
Blackhex 02.08.2012, 14:00
quelle

2 Antworten

11

Ich bin mir nicht sicher, welche Art von Betriebssystem Sie verwenden, aber Sie sollten überprüfen, ob Es unterstützt opportunistic memory allocation wie Linux.

Wenn es aktiviert ist, kann Folgendes passieren:

  1. Ihr new oder malloc erhält eine gültige Adresse vom Kernel. Auch wenn nicht genügend Speicher vorhanden ist , weil ...
  2. Der Kernel reserviert den Speicher nicht wirklich bis zum Moment des ersten Zugriffs.
  3. Wenn der gesamte "überbelegte" Speicher verwendet wird, hat das Betriebssystem keine Chance, aber einen der beteiligten Prozesse zu löschen. (Es ist zu spät, um dem Programm mitzuteilen, dass nicht genug Speicher vorhanden ist.) In Linux wird dies Kill (OOM Kill) . Solche Kills werden im Kernel-Nachrichtenpuffer protokolliert.

Lösung: Deaktivieren Sie das Überschreiben von Speicher: echo 2 > /proc/sys/vm/overcommit_memory

    
Black 02.08.2012, 15:00
quelle
1

Zwei Ideen kommen mir in den Sinn.

1.) Schreiben Sie Ihre eigene Speicherzuweisungsfunktion, anstatt direkt von new abhängig zu sein. Sie haben erwähnt, dass Sie sich auf einem Embedded-System befinden, in dem spezielle Allokatoren in Anwendungen häufig vorkommen. Laufen Sie Ihre Anwendung direkt auf der Hardware oder laufen Sie in einem Prozess unter einer Executive / OS-Schicht? Wenn letzteres vorhanden ist, gibt es eine System-API zur Speicherzuweisung?

2.) Überprüfen Sie C ++ set_new_handler und sehen Sie, ob es Ihnen helfen kann. Sie können anfordern, dass eine spezielle Funktion aufgerufen wird, wenn eine new -Zuordnung fehlschlägt. Vielleicht können Sie in dieser Funktion Maßnahmen ergreifen, um zu verhindern, dass alles, was den Prozess umbringt, ausgeführt wird. Referenz: Ссылка

    
Omaha 02.08.2012 14:12
quelle

Tags und Links