Frage Muss nach Speicherzuweisung nach NULL gesucht werden, wenn der Kernel Overcommit-Speicher verwendet


Es ist allgemein üblich nach NULL zu suchen (ob der Speicher erfolgreich zugeordnet wurde) nach einem malloc (), etwas Ähnlichem

void *ptr = malloc(10);    
if (ptr != NULL) {  
  // do some thing usefull  
} else {  
 // no memory. safely return/throw ...  
}  

Wenn die Speicherüberkomprimierung im Kernel aktiviert ist, besteht die Möglichkeit, NULL zu erhalten? Sollte ich der Praxis folgen, NULL für jede Zuweisung religiös zu überprüfen? Wird malloc trotz aggressivem Overcommit-Mechanismus NULL zurückgeben (ich schätze Wert 1)?

In der Tat verwendet Android Kernel Speicher overcommit (nicht sicher über den Wert, würde es gerne wissen (overcommit Wert) und seine Bedeutung). Ein Teil des Framework-Quellcodes (C / C ++) in Android (möglicherweise von Drittanbietern) prüft nicht nach NULL, noch fängt er bad_alloc nach Zuweisungen ab. Fehle ich etwas?

Es gibt einige Threads in SO bezüglich Overcommit Memory, aber keine von ihnen löste meine Verwirrung.

BEARBEITEN: Wenn eine aggressive Überbelegung verwendet wird, wird NULL nicht zurückgegeben (Annahme 1). Wenn kein physikalischer Speicher verfügbar ist und versucht wird, auf den zugewiesenen Speicher zuzugreifen (in den zugewiesenen Speicher schreiben), beendet OOM einen Prozess und weist Speicher für die Anwendung zu, bis dieser wiederum getötet wird (Annahme 2). In beiden Fällen sehe ich keinen Bedarf für das Checken von NULL (Speicher wird zugewiesen oder Prozess wird getötet). Bin ich richtig in meinen Annahmen?
Portabilität ist für diese Frage kein Thema.


25
2018-02-12 01:09


Ursprung


Antworten:


Ja, Sie sollten immer noch nach Fehlern suchen, die von zurückgegeben werden malloc. In einer Umgebung, in der Speicher nicht ausreicht, können Sie Fehler nicht erkennen und beheben, da in der Umgebung kein physischer Speicher mehr zur Verfügung steht, wenn Sie in Teile des Adressraums schreiben, die Ihrem Programm bei einem vorherigen Aufruf zugewiesen wurden malloc.

Dies ist jedoch nicht das einzige Problem, das ein Problem verursachen würde malloc in einer traditionellen Umgebung zu versagen. Eine Anforderung nach einem besonders großen Speicherblock, wenn der Adressraum Ihres Programms fragmentiert wurde, kann fehlschlagen, selbst wenn potenziell genug physischer Speicher vorhanden ist, um die Anforderung zu erfüllen. Weil es keinen zusammenhängenden Bereich von freiem Adressraum gibt malloc muss fehlschlagen. Dieser Fehlertyp muss signalisiert werden durch malloc Rückkehr NULL, ob die Umgebung Speicher überlastet oder nicht.


37
2018-02-17 11:56



Sie müssen den Rückgabewert für NULL überprüfen jeden Zeit. Jede Bibliotheksfunktion kann fehlschlagen. Sogar fclose () do (bei getrennter NFS-Freigabe und Fehler von fclose der NFS-Datei bedeutet, dass die Daten nicht gespeichert wurden).

Der Großteil der Software ist schlecht geschrieben und enthält nicht alle Überprüfungen.

malloc kann nicht anders als NULL oder Zeiger zurückgeben. Alles oder nichts. Sie können nicht 1 Byte von malloc bekommen, wenn Sie nach 10 fragen.


8
2018-02-15 15:01



Es wäre ratsam, bei allen Funktionsaufrufen, die NULL zurückgeben können, religiös nach NULL zu suchen, unabhängig davon, ob der Kernel einen überschreibbaren Speicher hat oder nicht.

Dieses folgende Codesegment zeigt, wie überprüft werden kann, ob der Anruf an malloc gearbeitet oder nicht ...

void * ptr = malloc (10);
if (ptr! = NULL) {
   / * Mach etwas hier mit ptr * /
}sonst{
   / * Mach etwas hier, wenn es scheitert * /
}

Dateioperationen, Speicheroperationen, um nur einige zu nennen, geben bei einem Fehler einen NULL-Wert zurück.

Hoffe das hilft, Freundliche Grüße, Tom.


2
2018-02-16 20:34



Nun ... unter Linux, da der Arbeitsspeicher nicht page-backed ist (initial) und nur nach dem ersten Lese- / Schreibzugriff eine Seitenunterstützung erzeugt, wird es dem Betriebssystem immer gelingen Speicher zu liefern (außer Sie haben den Adressraum erschöpft, was in 64-bit Systemen nicht möglich ist) ). Wenn also der Arbeitsspeicher knapp wird und Sie nicht den versprochenen Speicher erhalten können, wird der OOM-Killer Ihre Anwendung oder eine andere Anwendung einfach beenden, um Ihnen die Seitenunterstützung zu geben, die Sie benötigen. Also, ob Sie den NULL-Check machen oder nicht, das Ergebnis ist das gleiche, ein Crash .......


1
2018-04-24 04:37



Nein, das Ergebnis von malloc muss nicht überprüft werden.

Lange bevor malloc ausfallen würde, hatte das Betriebssystem bereits viele Probleme.


-5
2017-07-17 14:52