Frage

Ich habe unter den Erinnerungsbedingungen unter Linux über das Lesen gelesen, und der folgende Absatz von den Mannseiten hat mich zum Nachdenken gebracht:

Standardmäßig folgt Linux einer optimistischen Strategie zur Zuordnung von Speicher. Dies bedeutet, dass, wenn malloc () nicht null zurückgibt, keine Garantie dafür gibt, dass der Speicher wirklich verfügbar ist. Dies ist ein wirklich schlechter Fehler. Falls sich herausstellt, dass das System aus dem Gedächtnis ist, werden ein oder mehrere Prozesse vom berüchtigten Oom -Mörder getötet. [...

Wenn man bedenkt, dass die neue Implementierung des Betreibers irgendwann Malloc anrufen wird, gibt es Garantien, dass neue Linux tatsächlich angeben? Wenn es nicht gibt, wie geht man mit dieser scheinbar nicht nachweisbaren Fehlersituation um?

War es hilfreich?

Lösung

Es hängt davon ab, ob; Sie können die Überbeamten des Kernels konfigurieren Verwenden von vm.overcommit_Memory.

Herb Sutter hat vor einigen Jahren darüber gesprochen, wie Dieses Verhalten ist tatsächlich nicht mit dem C ++ - Standard konform:

"Bei einigen Betriebssystemen, einschließlich spezifisch Linux, gelingt es immer erfolgreich. Unter den Abdeckungen wird der (physische oder virtuelle) Speicher nicht dem Anforderungsprozess mit echtem Backing -Store verpflichtet, bis der Speicher tatsächlich verwendet wird.

"Beachten Sie, dass, wenn New die Einrichtungen des Betriebssystems direkt verwendet, immer wieder erfolgreich ist, aber jeder spätere unschuldige Code wie BUF [100] = 'C'; kann beide Effekte aus einem Standard -C ++ - Sicht werfen oder fehlen oder anhalten. sind nicht konform, da der C ++ - Standard erfordert, dass bei Neuem nicht genügend Speicher nicht festgelegt wird (dies nicht) und dieser Code wie BUF [100] = 'C' keine Ausnahme oder auf andere Weise fehlschlagen sollte (diese könnte)."

Andere Tipps

Sie können es nicht in Ihrer Software verarbeiten, rein und einfach.

Für Ihre Bewerbung erhalten Sie einen perfekt gültigen Zeiger. Sobald Sie versuchen, darauf zuzugreifen, erzeugt es einen Seitenfehler im Kernel, der Kernel wird versuchen, eine physische Seite dafür zuzuweisen und wenn es nicht ... boom.

Aber wie Sie sehen, all dies geschieht im Kernel, Ihre Bewerbung kann das nicht sehen. Wenn es sich um ein kritisches System handelt, können Sie das Überbeamte im System deaktivieren.

Ich denke, das Malloc kann immer noch Null zurückgeben. Der Grund dafür ist, dass es einen Unterschied zwischen dem verfügbaren Systemspeicher (RAM + Swap) und dem Betrag im Adressraum Ihres Prozesses gibt.

Wenn Sie beispielsweise 3 GB Speicher von Malloc auf einem Standard -X86 -Linux nachfragen, wird dies sicherlich NULL zurückgegeben, da dies angesichts der Speichermenge, die an Benutzerraum -Apps gegeben wurde, unmöglich ist.

Verzeihen Sie mir, wenn ich falsch liege, aber würde nicht versuchen, die zugewiesene Speicherin zu null, um zu garantieren, dass Sie jedes einzelne Byte haben, das Sie angefordert haben? Oder sogar nur in das letzte Byte schreiben, es würde eine Ausnahme ausgeben, wenn die Erinnerung wirklich nicht zu tun hätte, oder?

Wenn das stimmt, könnten Sie nur versuchen, das letzte (und zuerst?) Byte des Gedächtnisses zu schreiben und zu sehen, ob es gut funktioniert, und wenn dies nicht der Fall ist, könnten Sie Null von Malloc zurückgeben.

Ja, es gibt eine Garantie dafür, dass neue wird irgendwann werfen. Unabhängig vom Überbeamten ist die Menge des Adressraums begrenzt. Wenn Sie also weiterhin Speicher zuweisen, werden Sie früher oder später keinen Adressraum mehr haben und neu wird es zu werfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top