2012-08-02 9 views
8

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

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

+1

Ich bin nicht sicher, aber man kann versuchen, "neue (nothrow)" verwenden http://www.cplusplus.com/reference/std/ new/nothrow/ –

+0

Ich mache das in den meisten Fällen, sicherlich wenn ich größere Mengen an Speicher zuweise. In einigen Fällen war ich zu faul, um neu zu schreiben (std :: nothrow), aber ich nehme an, der Prozess würde mit Ausnahme statt SIGKILL enden. – Blackhex

Antwort

11

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

Wenn es aktiviert ist, kann folgendes passieren:

  1. Ihre new oder malloc bekommt eine gültige Adresse aus dem Kernel. Auch wenn es nicht genug Speicher gibt, weil ...
  2. Der Kernel reserviert nicht wirklich den Speicher bis zum Zeitpunkt des ersten Zugriffs.
  3. Wenn der gesamte "überlastete" Speicher verwendet wird, hat das Betriebssystem keine Chance, aber einen der beteiligten Prozesse zu beenden. (Es ist zu spät, dem Programm mitzuteilen, dass nicht genügend Speicher vorhanden ist.) In Linux heißt das Out Of Memory Kill (OOM Kill). Solche Kills werden im Kernel-Nachrichtenpuffer protokolliert.

Lösung: Deaktivieren Sie Overcommit Speicher: echo 2 > /proc/sys/vm/overcommit_memory

1

Zwei Ideen kommen 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.) Check out C++ set_new_handler und sehen, ob es Ihnen helfen kann. Sie können anfordern, dass eine spezielle Funktion aufgerufen wird, wenn eine new Zuweisung 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: http://www.cplusplus.com/reference/std/new/set_new_handler/

+0

hinzufügen 1) Ja, das ist ein Weg, wie man es umgehen kann, aber ich war zu faul, um so weit zu gehen, wenn es eine Systemkonfiguration-basierte Lösung geben könnte. Es ist offen Embedded Distribution so ziemlich schwer im Vergleich zu "echten" eingebetteten Systemen. Ich weiß nicht, ob es eine API für spezielle Speicherzuweisungen gibt. Irgendwelche Hinweise? add 2) Große Einsicht, ich werde das versuchen. – Blackhex