Wie geht ein Prozess mit der Situation um, wenn er keinen nutzbaren Speicher findet?

Wie geht ein Prozess mit der Situation um, wenn er keinen nutzbaren Speicher findet?

Was passiert, wenn ein bestimmter Prozess feststellt, dass kein nutzbarer Speicher vorhanden ist?

Wird dieser Prozess einen anderen Prozess beenden/neu starten, um mit seiner Aufgabe fortzufahren?

Oder was macht der Prozess (der mehr Speicher benötigt) in dieser Situation?

Kann jemand, wenn möglich, einen guten Link dazu bereitstellen?

Antwort1

Auf einigen bedarfsgesteuerten virtuellen Speichersystemen verweigert das Betriebssystem die Zuweisung anonymer Seiten (also Seiten mit Daten ohne Dateisystemquelle wie Laufzeitdaten, Programmstapel usw.), es sei denn, es ist ausreichend Swap-Speicher vorhanden, um die Seiten auszulagern und so physischen Speicher freizugeben. Diese strikte Abrechnung hat den Vorteil, dass jedem Prozess der Zugriff auf so viel virtuellen Speicher garantiert ist, wie er zuweist, bedeutet aber auch, dass die Menge des verfügbaren virtuellen Speichers im Wesentlichen durch die Größe des Swap-Speichers begrenzt ist.

Die Speicherabrechnung im Linux-Kernel versucht, Programme zu kompensieren, die dazu neigen, mehr Speicher zuzuweisen, als sie verwenden, indem sie die tatsächlich von Prozessen verwendete Speichermenge verfolgt undüberfordertdie Menge des virtuellen Speichers. Mit anderen Worten: Die Menge des vom Kernel zugewiesenen virtuellen Speichers kann die Menge des physischen Speichers und des Swap-Speichers zusammen im System überschreiten. In der Praxis bedeutet dies, dass die Speicherzuweisung malloc()niemals fehlschlägt. Dies führt zwar zu einer besseren Nutzung des physischen Speichers und des Swap-Speichers, der Nachteil besteht jedoch darin, dass der Kernel, wenn die verwendete Speichermenge die Menge des verfügbaren physischen Speichers und Swap-Speichers überschreitet, irgendwie Speicherressourcen freigeben muss, um die Speicherzuweisungsverpflichtung zu erfüllen.

Der Kernel-Mechanismus, der verwendet wird, um Speicher freizugeben und die Überbelegung auszugleichen, heißtOut-of-Memory-Killer (Nicht genügend Arbeitsspeicher)(OOM-Killer). Normalerweise beginnt der Mechanismus damit, speicherfressende „Rogue“-Prozesse zu töten, um Speicher für andere Prozesse freizugeben. Das Verhalten des OOM-Killers und des Speicherabrechnungsalgorithmus kann über sysctlEinstellungen oder/proc/sys/vm. Wenn die vm.panic_on_oomEinstellung ungleich Null ist, gerät der Kernel stattdessen in Panik, wenn dem System der Arbeitsspeicher ausgeht.

Die vom OOM-Killer verwendete Heuristik kann über die vm.oom_kill_allocating_taskEinstellung geändert werden. Standardmäßig durchsucht der OOM-Killer die Aufgabenliste und wählt eine unerwünschte Aufgabe aus, die viel Speicher verbraucht, um sie zu beenden. Der OOM-Killer kann auch so konfiguriert werden, dass er die Aufgabe beendet, die den Speichermangel ausgelöst hat.

Der Kernel-Speicherabrechnungsalgorithmus kann mit der vm.overcommit_memoryEinstellung angepasst werden. Standardmäßig werden vor dem Überschreiben einige schwache heuristische Prüfungen durchgeführt, der Speicherabrechnungsalgorithmus kann jedoch auch auf einen strikten Modus eingestellt werden, in dem die Begrenzung des virtuellen Adressraums durch den Wert der vm.overcommit_ratioEinstellungen gemäß der folgenden Formel bestimmt wird:

    virtual memory = (swap + physical memory * (overcommit_ratio / 100))

Wenn striktes Speicher-Accounting verwendet wird, wird der Kernel keine anonymen Seiten mehr zuordnen, es sei denn, er hat genügend freien physischen Speicher oder Swap-Speicher, um die Seiten zu speichern. Das bedeutet, dass es wichtig ist, dass das Systemmit ausreichend Swap-Speicher konfiguriert. Wenn nicht genügend physischer Speicher oder Swap-Speicher vorhanden ist, um die Speicherzuweisung zu erfüllen, malloc()können Aufrufe von fehlschlagen. In diesen Fällen muss das Programm selbst eine geeignete Vorgehensweise bestimmen. Einige geben vielleicht einfach auf und schlagen direkt fehl, aber sie könnten auch auf einen langsameren, aber speichereffizienteren Algorithmus zurückgreifen, um die Aktion auszuführen, für die sie die Speicherzuweisung benötigt hätten.

Antwort2

Das hängt von der Konfiguration des Programms ab. Einfache Programme geben einfach eine Fehlermeldung aus und beenden den Vorgang, wenn sie nicht genügend Speicher zuweisen können. Manche Programme versuchen, selbst Speicher freizugeben und versuchen es dann erneut. Manche Programme speichern den Zustand vor dem Beenden notfallmäßig. Manche Programme laufen irgendwie weiter und kommen ohne den zusätzlichen Speicher aus, vielleicht nachdem sie den Benutzer darüber informiert haben, dass ein Befehl nicht ausgeführt werden konnte.

Zwar könnte ein Prozess prinzipiell einen anderen Prozess beenden, doch wäre das ein äußerst merkwürdiges Verhalten. Der Prozess hätte keine Möglichkeit zu wissen, welche Prozesse beendet werden sollen, und keine Garantie, dass er auf deren Speicher zugreifen kann.

Wenn dasSpeichermangel wird vom Kernel erkanntAnstatt von der Anwendung kann der Kernel einige Prozesse auf der Grundlage komplexer Heuristiken (wie etwa „Nicht beenden sshd“) beenden.

verwandte Informationen