Ich kenne mich mit Überbeanspruchung des Gedächtnisses aus und mag es zutiefst nicht und deaktiviere es normalerweise.
Ein gut geschriebenes Programm kann malloc
(oder mmap
wird häufig verwendet malloc
) mehr Speicher als verfügbar und stürzt ab, wenn es verwendet wird. Ohne Speicherüberlastung würde dies malloc
oder mmap
fehlschlagen, und das gut geschriebene Programm würde diesen Fehler abfangen. Das schlecht geschriebene Programm ( malloc
ohne Prüfung auf Fehler) stürzt ab, wenn das Ergebnis eines Fehlers verwendet wird malloc
.
Natürlich ist der virtuelle Adressraum (der um mmap
so erweitert wird malloc
) nicht dasselbe wie RAM (RAM ist eine vom Kernel verwaltete Ressource, siehe dies ; Prozesse haben ihren virtuellen Adressraum durch execve (2) initialisiert und durch mmap
& sbrk
so don erweitert verbrauchen nicht direkt RAM, nur virtuellen Speicher ).
Beachten Sie, dass die Optimierung der RAM-Nutzung mit madvise (2) erfolgen kann (was einen Hinweis geben kann, indem MADV_DONTNEED
der Kernel verwendet wird, um einige Seiten auf die Festplatte zu tauschen), wenn dies wirklich erforderlich ist. Programme, die eine Überbindung wünschen, könnten mmap (2) mit verwenden MAP_NORESERVE
. Mein Verständnis von Speicherüberbelegung ist, als ob jede Speicherzuordnung (von execve
oder mmap
) implizit verwendet wirdMAP_NORESERVE
Meiner Meinung nach ist es einfach nützlich für sehr fehlerhafte Programme. Aber meiner Meinung nach ein echter Entwickler sollte immer überprüfen Ausfall malloc
, mmap
und den dazugehörigen virtuellen Adressraum wechselnden Funktionen (zB wie hier ). Und die meisten freien Softwareprogramme, deren Quellcode ich studiert habe, haben eine solche Prüfung, vielleicht als eine xmalloc
Funktion ....
Gibt es echte Programme, z. B. in typischen Linux-Distributionen, die tatsächlich Speicherüberlastung benötigen und auf vernünftige und nützliche Weise nutzen? Ich kenne keinen von ihnen!
Was sind die Nachteile des Deaktivierens von Speicherüberlastung? Viele ältere Unixe (z. B. SunOS4, SunOS5 aus dem vorigen Jahrhundert) hatten es nicht, und meiner Meinung nach war ihre malloc
(und vielleicht sogar die allgemeine Leistung des malloc
gesamten Systems ) nicht viel schlechter (und Verbesserungen seitdem hängen nicht mit einer Überlastung des Speichers zusammen). .
Ich glaube, dass eine Überbelegung des Speichers eine Fehlfunktion für faule Programmierer ist.
madvise
. Der Kernel erhält den Hinweis normalerweise ohnehin automatisch, indem er zählt, welche Seiten kürzlich verwendet wurden und welche nicht. Das MAP_NORESERVE
Flag für den mmap
Systemaufruf bedeutet nur, dass kein Swap-Speicherplatz für die Zuordnung reserviert ist und das Anforderungs-Paging nicht deaktiviert wird.
R
haben Probleme mit OpenBSD, weil sie viel virtuellen Speicher benötigen und OpenBSD sagt nein. Dieselben Pakete sind unter Linux in Ordnung und führen nicht dazu, dass der verrückte betrunkene Oom-Killer am Prozesstisch wegsprengt.