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 mmapwird häufig verwendet malloc) mehr Speicher als verfügbar und stürzt ab, wenn es verwendet wird. Ohne Speicherüberlastung würde dies mallocoder mmapfehlschlagen, und das gut geschriebene Programm würde diesen Fehler abfangen. Das schlecht geschriebene Programm ( mallocohne Prüfung auf Fehler) stürzt ab, wenn das Ergebnis eines Fehlers verwendet wird malloc.
Natürlich ist der virtuelle Adressraum (der um mmapso 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& sbrkso 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_DONTNEEDder 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 execveoder 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, mmapund 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 xmallocFunktion ....
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 mallocgesamten 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_NORESERVEFlag für den mmapSystemaufruf bedeutet nur, dass kein Swap-Speicherplatz für die Zuordnung reserviert ist und das Anforderungs-Paging nicht deaktiviert wird.
Rhaben 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.